Рубрики
Без рубрики

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

Узнайте, как работать с парами ключ-значение в Java с помощью java.util.Класс свойств.

Автор оригинала: baeldung.

1. Обзор

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

И поэтому язык имеет первоклассную поддержку свойств – java.util.Свойства – служебный класс, предназначенный для обработки файлов конфигурации этого типа.

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

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

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

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

свойства приложения:

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 class также может загружать 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, а второй вместо этого вернет значение по умолчанию .

Пример кода:

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 class наследует get() метод от Hashtable class, я бы не рекомендовал вам использовать его для получения значения. Потому что его метод get() вернет значение Object , которое может быть приведено только к String , а метод getProperty() уже правильно обрабатывает необработанное значение Object для вас.

Приведенный ниже код вызовет Исключение :

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);

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

Приведенный ниже код не будет работать так, как вы хотите, когда вы используете 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. Хранить в файлах свойств

Свойства класс предоставляет метод 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 ” – на нашем пути к классу:

свойства по умолчанию:

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 (латиница-1), поэтому обычно не следует использовать свойства с символами, выходящими за рамки ISO-8859-1.

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

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

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

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

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

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