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
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 .