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

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

Вопросы:

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

Ответ 1

Вы можете передать 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);
}

Ответ 2

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

  • Любое расширение прекрасно, хотя .properties чаще встречается в моем опыте

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

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

Ответ 3

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

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

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

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

Ответ 4

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

  • Сохраните файл в том же пакете.
  • Рекомендуем расширение .properties, но вы можете выбрать свой собственный.
  • Используйте классы тезисов, расположенные в классах java.util package = > properties, ListResourceBundle, ResourceBundle.
  • Чтобы прочитать свойства, используйте итератор или перечислитель или прямые методы класса 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"));

Ответ 5

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

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

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

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

Ответ 6

Пример:

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

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

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

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

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

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

Ответ 8

В порядке:

  • Вы можете хранить файл почти где угодно.
  • не требуется расширение.
  • Montecristo проиллюстрировал, как загрузить это. Это должно работать нормально.
  • propertyNames() дает вам перечисление для итерации через.

Ответ 9

Свойства стали устаревшими. Preferences класс является предпочтительным для свойств.

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

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

  • Строка
  • булева
  • двойной
  • поплавок
  • ИНТ
  • длинный
  • массив байтов

Чтобы загрузить файл свойств, вы можете предоставить абсолютный путь или использовать getResourceAsStream(), если файл свойств присутствует в вашем пути к классам.

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>

Посмотрите на статью на внутренности хранилищ предпочтений

Ответ 10

Чтение файла свойств и загрузка его содержимого в 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());
    }

Ответ 11

1) Хорошо иметь свой файл свойств в 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) Файлы свойств имеют расширение как .properties

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

Посмотрите http://sourceforge.net/projects/jhpropertiestyp/

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

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

Ответ 15

Здесь готов статический класс

import java.io.*;
import java.util.Properties;
public class Settings {
    public static String Get(String name,String defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return props.getProperty(name);
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static Integer Get(String name,Integer defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return Integer.valueOf(props.getProperty(name));
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static Boolean Get(String name,Boolean defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return Boolean.valueOf(props.getProperty(name));
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static void Set(String name, String value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer, Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
    public static void Set(String name, Integer value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer,Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
    public static void Set(String name, Boolean value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer,Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
}

Вот пример:

Settings.Set("valueName1","value");
String val1=Settings.Get("valueName1","value");
Settings.Set("valueName2",true);
Boolean val2=Settings.Get("valueName2",true);
Settings.Set("valueName3",100);
Integer val3=Settings.Get("valueName3",100);

Ответ 16

Вы можете загрузить файл свойств следующим образом:

InputStream is = new Test().getClass().getClassLoader().getResourceAsStream("app.properties");
        Properties props =  new Properties();
        props.load(is);

А затем вы можете перебрать карту, используя лямбда-выражение, например:

props.stringPropertyNames().forEach(key -> {
            System.out.println("Key is :"+key + " and Value is :"+props.getProperty(key));
        });