Първи стъпки с Java Properties

1. Общ преглед

Повечето приложения на Java трябва да използват свойства в даден момент, обикновено за съхраняване на прости параметри като двойки ключ-стойност, извън компилирания код.

И така, езикът има първокласна поддръжка за свойства - java.util.Properties - полезен клас, предназначен за работа с този тип конфигурационни файлове.

На това ще се спрем в тази статия.

2. Зареждане на свойства

2.1. От Properties Files

Нека започнем с пример за зареждане на двойки ключ-стойност от файлове със свойства; зареждаме два файла, с които разполагаме в нашата пътека на класа:

app.properties:

version=1.0 name=TestApp date=2016-11-12

И каталог :

c1=files c2=images c3=videos

Забележете, че въпреки че файловете със свойства се препоръчва да се използва „ .properties “, суфиксът, това не е необходимо.

Вече можем да ги заредим много просто в екземпляр на Properties :

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String appConfigPath = rootPath + "app.properties"; String catalogConfigPath = rootPath + "catalog"; Properties appProps = new Properties(); appProps.load(new FileInputStream(appConfigPath)); Properties catalogProps = new Properties(); catalogProps.load(new FileInputStream(catalogConfigPath)); String appVersion = appProps.getProperty("version"); assertEquals("1.0", appVersion); assertEquals("files", catalogProps.getProperty("c1"));

Докато съдържанието на даден файл отговаря на изискванията за файлов формат на свойства, той може да бъде анализиран правилно от класа Properties . Ето още подробности за файловия формат на свойството.

2.2. Зареждане от XML файлове

Освен файлове със свойства, класът Properties може също да зарежда XML файлове, които съответстват на специфичните DTD спецификации.

Ето пример за зареждане на двойки ключ-стойност от XML файл - icons.xml :

   xml example icon1.jpg icon2.jpg icon3.jpg 

Сега нека го заредим:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String iconConfigPath = rootPath + "icons.xml"; Properties iconProps = new Properties(); iconProps.loadFromXML(new FileInputStream(iconConfigPath)); assertEquals("icon1.jpg", iconProps.getProperty("fileIcon"));

3. Вземете свойства

Можем да използваме getProperty (String ключ) и getProperty (String ключ, String defaultValue), за да получим стойност от неговия ключ.

Ако двойката ключ-стойност съществува, двата метода ще върнат съответната стойност. Но ако няма такава двойка ключ-стойност, първият ще върне null, а вторият ще върне defaultValue вместо това.

Примерен код:

String appVersion = appProps.getProperty("version"); String appName = appProps.getProperty("name", "defaultName"); String appGroup = appProps.getProperty("group", "baeldung"); String appDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("1.0", appVersion); assertEquals("TestApp", appName); assertEquals("baeldung", appGroup); assertNull(appDownloadAddr);

Имайте предвид, че въпреки че класът Properties наследява метода get () от клас Hashtable , не бих препоръчал да го използвате, за да получите стойност. Тъй като методът get () ще върне стойност на обект, която може да бъде предадена само на String, а методът getProperty () вече обработва суровата стойност на обекта правилно за вас.

Кодът по-долу ще изведе изключение :

float appVerFloat = (float) appProps.get("version");

4. Задайте свойства

Можем да използваме метода setProperty () , за да актуализираме съществуваща двойка ключ-стойност или да добавим нова двойка ключ-стойност.

Примерен код:

appProps.setProperty("name", "NewAppName"); // update an old value appProps.setProperty("downloadAddr", "www.baeldung.com/downloads"); // add new key-value pair String newAppName = appProps.getProperty("name"); assertEquals("NewAppName", newAppName); String newAppDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("www.baeldung.com/downloads", newAppDownloadAddr);

Имайте предвид, че въпреки Имоти клас наследи пуснати () метод и putAll () метод от Hashtable клас, не бих ви препоръчваме да ги използват по същата причина както за GET () метод: само String стойности могат да бъдат използвани в имоти .

Кодът по-долу няма да работи както желаете, когато използвате getProperty (), за да получите стойността му, той ще върне null :

appProps.put("version", 2);

5. Премахване на свойства

Ако искате да премахнете двойка ключ-стойност, можете да използвате метода remove () .

Примерен код:

String versionBeforeRemoval = appProps.getProperty("version"); assertEquals("1.0", versionBeforeRemoval); appProps.remove("version"); String versionAfterRemoval = appProps.getProperty("version"); assertNull(versionAfterRemoval);

6. Съхранявайте

6.1. Съхраняване на файлове с имоти

Класът Properties осигурява метод store () за извеждане на двойки ключ-стойност.

Примерен код:

String newAppConfigPropertiesFile = rootPath + "newApp.properties"; appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");

The second parameter is for comment. If you don't want to write any comment, simply use null for it.

6.2. Store to XML Files

Properties class also provides a storeToXML() method to output key-value pairs in XML format.

Example code:

String newAppConfigXmlFile = rootPath + "newApp.xml"; appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");

The second parameter is as same as it in the store() method.

7. Other Common Operations

Properties class also provides some other methods to operate the properties.

Example code:

appProps.list(System.out); // list all key-value pairs Enumeration valueEnumeration = appProps.elements(); while (valueEnumeration.hasMoreElements()) { System.out.println(valueEnumeration.nextElement()); } Enumeration keyEnumeration = appProps.keys(); while (keyEnumeration.hasMoreElements()) { System.out.println(keyEnumeration.nextElement()); } int size = appProps.size(); assertEquals(3, size);

8. Default Property List

A Properties object can contain another Properties object as its default property list. The default property list will be searched if the property key is not found in the original one.

Besides “app.properties“, we have another file – “default.properties” – on our classpath:

default.properties:

site=www.google.com name=DefaultAppName topic=Properties category=core-java

Example Code:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String defaultConfigPath = rootPath + "default.properties"; Properties defaultProps = new Properties(); defaultProps.load(new FileInputStream(defaultConfigPath)); String appConfigPath = rootPath + "app.properties"; Properties appProps = new Properties(defaultProps); appProps.load(new FileInputStream(appConfigPath)); assertEquals("1.0", appVersion); assertEquals("TestApp", appName); assertEquals("www.google.com", defaultSite);

9. Properties and Encoding

By default, properties files are expected to be ISO-8859-1 (Latin-1) encoded, so properties with characters outside of the ISO-8859-1 shouldn't generally be used.

We can work around that limitation with the help of tools such as the JDK native2ascii tool or explicit encodings on files, if necessary.

For XML files, the loadFromXML() method and the storeToXML() method use UTF-8 character encoding by default.

Когато обаче четем XML файл, кодиран по различен начин, можем да посочим това в декларацията DOCTYPE ; писането също е достатъчно гъвкаво - можем да посочим кодирането в трети параметър на API на storeToXML () .

10. Заключение

В тази статия обсъдихме основното използване на класа Properties , включително как да използваме свойствата за зареждане и съхраняване на двойки ключ-стойност както в свойствата, така и в XML формат, как да управляваме двойки ключ-стойност в обект Properties , като извличане на стойности, актуализиране на стойности , да получите неговия размер и как да използвате списък по подразбиране за обект Properties .

Пълният изходен код за примера е наличен в този проект на GitHub.