How to use Java property files?

2018-12-31 12:34发布

问题:

I have a list of key/value pairs of configuration values I want to store as Java property files, and later load and iterate through.

Questions:

  • Do I need to store the file in the same package as the class which will load them, or is there any specific location where it should be placed?
  • Does the file need to end in any specific extension or is .txt OK?
  • How can I load the file in the code
  • And how can I iterate through the values inside?

回答1:

You can pass an InputStream to the Property, so your file can pretty much be anywhere, and called anything.

Properties properties = new Properties();
try {
  properties.load(new FileInputStream(\"path/filename\"));
} catch (IOException e) {
  ...
}

Iterate as:

for(String key : properties.stringPropertyNames()) {
  String value = properties.getProperty(key);
  System.out.println(key + \" => \" + value);
}


回答2:

  • You can store the file anywhere you like. If you want to keep it in your jar file, you\'ll want to use Class.getResourceAsStream() or ClassLoader.getResourceAsStream() to access it. If it\'s on the file system it\'s slightly easier.

  • Any extension is fine, although .properties is more common in my experience

  • Load the file using Properties.load, passing in an InputStream or a StreamReader if you\'re using Java 6. (If you are using Java 6, I\'d probably use UTF-8 and a Reader instead of the default ISO-8859-1 encoding for a stream.)

  • Iterate through it as you\'d iterate through a normal Hashtable (which Properties derives from), e.g. using keySet(). Alternatively, you can use the enumeration returned by propertyNames().



回答3:

If you put the properties file in the same package as class Foo, you can easily load it with

new Properties().load(Foo.class.getResourceAsStream(\"file.properties\"))

Given that Properties extends Hashtable you can iterate over the values in the same manner as you would in a Hashtable.

If you use the *.properties extension you can get editor support, e.g. Eclipse has a properties file editor.



回答4:

There are many ways to create and read properties files:

  1. Store the file in the same package.
  2. Recommend .properties extension however you can choose your own.
  3. Use theses classes located at java.util package => Properties, ListResourceBundle, ResourceBundle classes.
  4. To read properties, use iterator or enumerator or direct methods of Properties or java.lang.System class.

ResourceBundle class:

 ResourceBundle rb = ResourceBundle.getBundle(\"prop\"); // prop.properties
 System.out.println(rb.getString(\"key\"));

Properties class:

Properties ps = new Properties();
ps.Load(new java.io.FileInputStream(\"my.properties\"));


回答5:

This load the properties file:

Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
  prop.load(stream);
} finally {
  stream.close();
}

I use to put the .properties file in a directory where I have all the configuration files, I do not put it together with the class that accesses it, but there are no restrictions here.

For the name... I use .properties for verbosity sake, I don\'t think you should name it .properties if you don\'t want.



回答6:

Example:

Properties pro = new Properties();
FileInputStream in = new FileInputStream(\"D:/prop/prop.properties\");
pro.load(in);
String temp1[];
String temp2[];
// getting values from property file
String username = pro.getProperty(\"usernamev3\");//key value in prop file 
String password = pro.getProperty(\"passwordv3\");//eg. username=\"zub\"
String delimiter = \",\";                         //password=\"abc\"
temp1=username.split(delimiter);
temp2=password.split(delimiter);


回答7:

In order:

  1. You can store the file pretty much anywhere.
  2. no extension is necessary.
  3. Montecristo has illustrated how to load this. That should work fine.
  4. propertyNames() gives you an enumeration to iterate through.


回答8:

By default, Java opens it in the working directory of your application (this behavior actually depends on the OS used). To load a file, do:

Properties props = new java.util.Properties();
FileInputStream fis new FileInputStream(\"myfile.txt\");
props.load(fis)

As such, any file extension can be used for property file. Additionally, the file can also be stored anywhere, as long as you can use a FileInputStream.

On a related note if you use a modern framework, the framework may provide additionnal ways of opening a property file. For example, Spring provide a ClassPathResource to load a property file using a package name from inside a JAR file.

As for iterating through the properties, once the properties are loaded they are stored in the java.util.Properties object, which offer the propertyNames() method.



回答9:

Properties has become legacy. Preferences class is preferred to Properties.

A node in a hierarchical collection of preference data. This class allows applications to store and retrieve user and system preference and configuration data. This data is stored persistently in an implementation-dependent backing store. Typical implementations include flat files, OS-specific registries, directory servers and SQL databases. The user of this class needn\'t be concerned with details of the backing store.

Unlike properties which are String based key-value pairs, The Preferences class has several methods used to get and put primitive data in the Preferences data store. We can use only the following types of data:

  1. String
  2. boolean
  3. double
  4. float
  5. int
  6. long
  7. byte array

To load the the properties file, either you can provide absolute path Or use getResourceAsStream() if the properties file is present in your classpath.

package com.mypack.test;

import java.io.*;
import java.util.*;
import java.util.prefs.Preferences;

public class PreferencesExample {

    public static void main(String args[]) throws FileNotFoundException {
        Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class);
        // Load file object
        File fileObj = new File(\"d:\\\\data.xml\");
        try {
            FileInputStream fis = new FileInputStream(fileObj);
            ps.importPreferences(fis);
            System.out.println(\"Prefereces:\"+ps);
            System.out.println(\"Get property1:\"+ps.getInt(\"property1\",10));

        } catch (Exception err) {
            err.printStackTrace();
        }
    }
}

xml file:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE preferences SYSTEM \'http://java.sun.com/dtd/preferences.dtd\'>
<preferences EXTERNAL_XML_VERSION=\"1.0\">
<root type=\"user\">
<map />
<node name=\"com\">
  <map />
  <node name=\"mypack\">
    <map />
    <node name=\"test\">
      <map>
        <entry key=\"property1\" value=\"80\" />
        <entry key=\"property2\" value=\"Red\" />
      </map>
    </node>
  </node>
</node>
</root>
</preferences>

Have a look at this article on internals of preferences store



回答10:

Reading a properties file and loading its contents to Properties

String filename = \"sample.properties\";
Properties properties = new Properties();

input = this.getClass().getClassLoader().getResourceAsStream(filename);
properties.load(input);

The following is the efficient way to iterate over a Properties

    for (Entry<Object, Object> entry : properties.entrySet()) {

        System.out.println(entry.getKey() + \" => \" + entry.getValue());
    }


回答11:

1) It is good to have your property file in classpath but you can place it anywhere in project.

Below is how you load property file from classpath and read all properties.

Properties prop = new Properties();
InputStream input = null;

try {

    String filename = \"path to property file\";
    input = getClass().getClassLoader().getResourceAsStream(filename);
    if (input == null) {
        System.out.println(\"Sorry, unable to find \" + filename);
        return;
    }

    prop.load(input);

    Enumeration<?> e = prop.propertyNames();
    while (e.hasMoreElements()) {
        String key = (String) e.nextElement();
        String value = prop.getProperty(key);
        System.out.println(\"Key : \" + key + \", Value : \" + value);
    }

} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    if (input != null) {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2) Property files have the extension as .properties



回答12:

In Java 8 to get all your properties

public static Map<String, String> readPropertiesFile(String location) throws Exception {

    Map<String, String> properties = new HashMap<>();

    Properties props = new Properties();
    props.load(new FileInputStream(new File(location)));

    props.forEach((key, value) -> {
        properties.put(key.toString(), value.toString());
    });

    return properties;
}


回答13:

Here is another way to iterate over the properties:

Enumeration eProps = properties.propertyNames();
while (eProps.hasMoreElements()) { 
    String key = (String) eProps.nextElement(); 
    String value = properties.getProperty(key); 
    System.out.println(key + \" => \" + value); 
}


回答14:

I have written on this property framework for the last year. It will provide of multiple ways to load properties, and have them strongly typed as well.

Have a look at http://sourceforge.net/projects/jhpropertiestyp/

JHPropertiesTyped will give the developer strongly typed properties. Easy to integrate in existing projects. Handled by a large series for property types. Gives the ability to one-line initialize properties via property IO implementations. Gives the developer the ability to create own property types and property io\'s. Web demo is also available, screenshots shown above. Also have a standard implementation for a web front end to manage properties, if you choose to use it.

Complete documentation, tutorial, javadoc, faq etc is a available on the project webpage.