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



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



вопросы:




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

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

  • как я могу загрузить файл в код

  • и как я могу перебирать значения внутри?

682   14  

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 и A Reader вместо кодировки ISO-8859-1 по умолчанию для потока.)

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

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

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

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

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

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

  1. сохраните файл в том же пакете.
  2. рекомендую .properties расширение, однако вы можете выбрать свой собственный.
  3. используйте классы тезисов, расположенные по адресу java.util package =>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.

в соответствующем примечании если вы используете современный фреймворк, фреймворк может предоставлять дополнительные способы открытия файла свойств. Например, весной обеспечивают 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>

взгляните на это статьи на внутренних устройствах предпочтений store

чтение файла свойств и загрузка его содержимого в 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 .свойства

In 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 даст разработчику строго типизированные свойства. Легко интегрируется в существующие проекты. Обрабатывается большой серией для типов свойств. Дает возможность одной строкой инициализации свойства через свойства ИО реализации. Дает разработчику возможность создавать собственные типы свойств и свойства ввода-вывода. Веб-демонстрация также доступна, скриншоты, показанные выше. Также есть стандартная реализация для веб-интерфейса для управления свойствами, если вы решите его использовать.

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

Comments

    Ничего не найдено.