У меня есть список пар ключ/значение значений конфигурации, которые я хочу хранить как файлы свойств 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));
});