Как использовать файлы свойств Java?

У меня есть список пар ключ/значение значений конфигурации, которые я хочу сохранить как файлы свойств Java, а затем загрузить и выполнить итерацию.

вопросы:

  • нужно ли хранить файл в том же пакете, что и класс, который их загрузит, или есть какое-либо конкретное место, где он должен быть размещен?
  • должен ли файл заканчиваться каким-либо конкретным расширением или .txt ОК?
  • как я могу загрузить файл в код
  • и как я могу перебирать значения внутри?

14 ответов


Вы можете передать InputStream в свойство, поэтому ваш файл может быть практически в любом месте и называться чем угодно.

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

итерации как:

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

  • вы можете сохраните файл в любом месте вам нравится. Если вы хотите сохранить его в своем файле jar, вы захотите использовать Class.getResourceAsStream() или ClassLoader.getResourceAsStream() для доступа к нему. Если это в файловой системе, это немного проще.

  • любое расширение в порядке, хотя .свойства более распространены в моем опыте

  • Загрузить файл с помощью Properties.load, проходящей в InputStream или StreamReader если вы используете Java 6. (Если ты are используя Java 6, я бы, вероятно, использовал UTF-8 и Reader вместо кодировки ISO-8859-1 по умолчанию для потока.)

  • итерации через него, как вы бы итерации через нормальный Hashtable (где Properties происходит от), например, с помощью keySet(). Кроме того, можно использовать перечисление, возвращаемое propertyNames().


Если вы поместите файл свойств в тот же пакет, что и класс Foo, вы можете легко загрузить его с помощью

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

учитывая, что свойства расширяют хэш-таблицу, вы можете перебирать значения так же, как и в хэш-таблице.

Если вы используете *.расширение свойств вы можете получить поддержку редактора, например, Eclipse имеет редактор файлов свойств.


существует множество способов создания и чтения properties файлы:

  1. сохраните файл в том же пакете.
  2. рекомендую .properties расширение, однако вы можете выбрать свой собственный.
  3. используйте классы тезисов, расположенные по адресу java.util упаковка => Properties, ListResourceBundle, ResourceBundle классы.
  4. для чтения свойств используйте итератор или перечислитель или прямые методы Properties или java.lang.System класса.

ResourceBundle класс:

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

Properties класс:

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

загрузить файл свойств:

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

Я использую, чтобы поставить .файл свойств в каталоге, где у меня есть все файлы конфигурации, я не помещаю его вместе с классом, который обращается к нему, но здесь нет никаких ограничений.

имя... Я использую .свойства для многословия, я не думаю, что вы должны назвать его .недвижимость, если не хотите.


пример:

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);

по порядку:

  1. вы можете сохранить файл где угодно.
  2. расширение не надо.
  3. Монтекристо имеет иллюстрированная как загрузить этот. Это должно сработать.
  4. propertyNames() дает вам перечисление для итерации.

по умолчанию Java открывает его в рабочем каталоге вашего приложения (это поведение фактически зависит от используемой ОС). Чтобы загрузить файл, выполните:

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

таким образом, любое расширение файла может использоваться для файла свойств. Кроме того, файл также может храниться в любом месте, если вы можете использовать FileInputStream.

в соответствующем примечании если вы используете современный фреймворк, фреймворк может предоставить дополнительные способы открытия файла свойств. Например, Spring provide a ClassPathResource загрузка файла свойств с помощью имени пакета из файла JAR.

Что касается итерации свойств, то после загрузки свойств они сохраняются в java.util.Properties объект, который предлагает propertyNames() метод.


Properties стала наследием. настройки класс предпочтительнее свойств.

узел в иерархической коллекции данных предпочтений. Этот класс позволяет приложениям хранить и извлекать пользовательские и системные предпочтения и данные конфигурации. Эти данные постоянно хранятся в резервном хранилище, зависящем от реализации. Типичные реализации включают плоские файлы, реестры ОС, серверы каталогов и базы данных SQL. Пользователь этого класса не нужно беспокоиться о деталях резервного магазина.

В отличие от свойств, которые являются строковыми парами ключ-значение,Preferences класс имеет несколько методов, используемых для получения и размещения примитивных данных в хранилище данных настроек. Мы можем использовать только следующие типы данных:

  1. строка
  2. boolean
  3. двойной
  4. float
  5. int
  6. долго
  7. байт массив

чтобы загрузить файл свойств, вы можете указать абсолютный путь или использовать getResourceAsStream() Если файл свойств присутствует в вашем 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-файл:

<?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>

посмотри статьи на внутренних предпочтений магазина


чтение файла свойств и загрузка его содержимого в Properties

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

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

ниже приведен эффективный способ итерации по Properties

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

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

1) Хорошо иметь свой файл в classpath, но вы можете разместить его в любом месте в проекте.

ниже показано, как загрузить файл свойств из classpath и прочитать все свойства.

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) файлы свойств имеют расширение as .свойства


на Java 8 чтобы получить все свои свойства

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;
}

вот еще один способ перебора свойств:

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

Я написал об этой структуре свойств за последний год. Он предоставит несколько способов загрузки свойств, и они также будут строго типизированы.

взгляните на http://sourceforge.net/projects/jhpropertiestyp/

JHPropertiesTyped даст разработчику строго типизированные свойства. Легко интегрируется в существующие проекты. Обрабатывается большой серией для типов свойств. Дает возможность однострочной инициализации свойств через свойство IO реализации. Дает разработчику возможность создавать собственные типы свойств и свойства ввода-вывода. Веб-демо также доступна, скриншоты, показанные выше. Также есть стандартная реализация для веб-интерфейса для управления свойствами, если вы решите его использовать.

полная документация, учебник, javadoc, faq и т. д. доступна на веб-странице проекта.