Начало работы со свойствами Java

Начало работы со свойствами Java

1. обзор

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

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

Это то, на чем мы сосредоточимся в этой статье.

2. Загрузка свойств

2.1. Из файлов свойств

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

app.properties:

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

Иcatalog:

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. Вот более подробная информация оProperty file format.

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 key) иgetProperty(String key, String defaultValue), чтобы получить значение по его ключу.

Если пара ключ-значение существует, оба метода будут возвращать соответствующее значение. Но если такой пары ключ-значение нет, первая вернет null, а вторая вместо этого вернетdefaultValue.

Пример кода:

String appVersion = appProps.getProperty("version");
String appName = appProps.getProperty("name", "defaultName");
String appGroup = appProps.getProperty("group", "example");
String appDownloadAddr = appProps.getProperty("downloadAddr");

assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("example", appGroup);
assertNull(appDownloadAddr);

Обратите внимание: хотя классProperties наследует методget() от классаHashtable, я бы не рекомендовал вам использовать его для получения значения. Поскольку его методget() вернет значениеObject, которое может быть приведено только кString, а методgetProperty() уже правильно обрабатывает необработанное значениеObject для вас.

Код ниже выдастException:

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

4. Установить свойства

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

Пример кода:

appProps.setProperty("name", "NewAppName"); // update an old value
appProps.setProperty("downloadAddr", "www.example.com/downloads"); // add new key-value pair

String newAppName = appProps.getProperty("name");
assertEquals("NewAppName", newAppName);

String newAppDownloadAddr = appProps.getProperty("downloadAddr");
assertEquals("www.example.com/downloads", newAppDownloadAddr);

Обратите внимание, что хотя классProperties наследует методput() и методputAll() от классаHashtable, я бы не рекомендовал вам использовать их по той же причине, что и дляget() метод: вProperties можно использовать только значения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");

Второй параметр для комментариев. Если вы не хотите писать какие-либо комментарии, просто используйте для них null.

6.2. Сохранить в файлы XML

КлассProperties также предоставляет методstoreToXML() для вывода пар ключ-значение в формате XML.

Пример кода:

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

Второй параметр такой же, как и в методеstore().

7. Другие общие операции

КлассProperties также предоставляет некоторые другие методы для работы со свойствами.

Пример кода:

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. Список свойств по умолчанию

ОбъектProperties может содержать другой объектProperties в качестве своего списка свойств по умолчанию. Список свойств по умолчанию будет найден, если ключ свойства не найден в исходном.

Помимо «app.properties», у нас есть еще один файл - «default.properties» - в нашем пути к классам:

default.properties:

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

Пример кода:

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. Свойства и кодировка

По умолчанию файлы свойств должны иметь кодировку ISO-8859-1 (Latin-1), поэтому свойства с символами, не входящими в ISO-8859-1, обычно не используются.

Мы можем обойти это ограничение с помощью таких инструментов, как инструмент JDK native2ascii или явное кодирование файлов, если это необходимо.

Для файлов XML методloadFromXML() и методstoreToXML() по умолчанию используют кодировку символов UTF-8.

Однако при чтении файла XML, закодированного по-другому, мы можем указать это в объявленииDOCTYPE; запись также достаточно гибкая - мы можем указать кодировку в третьем параметре APIstoreToXML().

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

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

Полный исходный код примера доступен в этомGitHub project.