Как создать файл application properties

Обновлено: 30.06.2024

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

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

  • Properties является подклассом Hashtable. Он используется для ведения списков значений, в которых ключ является строкой, а значение также является строкой.
  • Класс Properties используется многими другими классами Java. Например, это тип объекта, возвращаемый System.getProperties() при получении значений.
  • Одна полезная возможность класса состоит в том, что вы можете указать свойство по умолчанию, которое будет возвращаться, если никакое значение не связано с определенным ключом.
  • Несколько потоков могут совместно использовать один объект без необходимости внешней синхронизации.
  • Properties определяет переменную экземпляра.
  • Properties() создает объект Properties, который не имеет значений по умолчанию.
  • Properties (Properties propDefault): второй создает объект, который использует propDefault в качестве значения по умолчанию.

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

Теперь мы можем очень просто загрузить их в экземпляр Properties:

Если содержимое файла соответствует требованиям формата файла свойств, оно может быть правильно проанализировано классом Properties.

Загрузка из файлов XML

Помимо файлов, класс Properties также может загружать файлы XML, которые соответствуют определенным спецификациям DTD.

Теперь давайте загрузим:

Как получить свойства?

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

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

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

Код ниже выдаст исключение:
float appVerFloat = (float) appProps.get("version");

Как установить свойства

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

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

Приведенный ниже код не будет работать так, как вы хотите, когда вы используете getProperty() для получения его значения, он вернет null:
appProps.put("version", 2);

Удалить свойства

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

Хранение Properties

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

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

Хранение в XML-файлах

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

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

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

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

Мы можем обойти это ограничение с помощью таких инструментов, как JDK native2ascii или явное кодирование файлов, если это необходимо. Для файлов XML метод loadFromXML() и метод storeToXML() по умолчанию используют кодировку UTF-8.

Полный исходный код проекта доступен на GitHub

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

В наше время почти в каждом проекте используются различные статические файлы и данные, необходимые классам для безопасного и быстрого доступа. Примером таких конфигурационных файлов являются так называемые Файлы свойств, более известные как *.properties.

Каждый параметр сохраняется парой двух переменных строчной типа, одна сохраняет имя параметра (так называемый ключ), а другой сохраняет значение. Каждая строка файла .properties, как правило, хранит значения одного параметра. Несколько форматов являются допустимыми для .properties, в том числе ключ = значение, ключ: значение и сам ключ.

Например работы с .properties в Java

Для начала подготовим среду для работы и создадим проект (Рисунок 1):

1

Теперь посмотрим на структуру созданного проекта (Рисунок 2):

2

Как видим, в папке Resources уже есть файл под названием config.properties. Вам нужно будет его создать вручную и наполнить данными, а именно (Рисунки 3-4):

3

4

Далее прописываем необходимые ключи и значения, как на рисунке 5:

5

Пример обращения к файлу properties

Ниже представлена программа, демонстрирующая обращение к нашему конфигурационному файлу:

Properties - 1

В Java принято делать программы гибкими и легко настраиваемыми. Иногда еще говорят легко конфигурируемыми (от конфигурация).

Например, твоя программа раз в час копирует файлы из некоторой директории, архивирует их и отсылает тебе на email. Для этого программе надо знать директорию, откуда брать файлы и email, куда их посылать. Такие данные принято хранить не в коде программы, а в отдельных файлах свойств – properties-файлах.

Данные в таком файле хранятся в виде пар ключ-значение, разделенные знаком равно.

Слева от знака равно – имя (ключ), справа – значение.

Для удобной работы с такими файлами в Java есть специальный класс – Properties. Класс Properties унаследован от Hashtable<Object,Object>. Его даже можно рассматривать как HashTable, который умеет загружать себя из файла.

Метод Описание
void load(Reader reader) Загружает свойства из файла, представленного объектом Reader
void load(InputStream inStream) Загружает свойства из файла, представленного объектом InputStream
void loadFromXML(InputStream in) Загружает свойства из XML-файла
Object get(Object key) Возвращает значение по ключу. Метод унаследован от HashTable
String getProperty(String key) Возвращает значение свойства (строку) по ключу
String getProperty(String key, String defaultValue) Возвращает значение свойства по ключу или defaultValue, если такого ключа нет
Set<String> stringPropertyNames() Возвращает список всех ключей

Т.е. фактически тебе нужно выполнить всего две операции – загрузить в объект Properties данные из какого-нибудь файла, а затем получить эти свойства с помощью метода getProperty(). Ну и не забывай, что можешь пользоваться объектом Properties как HashMap.

Вот тебе пример:

В этой статье мы рассмотрим, как задать свойства Spring Boot приложения в файле application.properties, а также как получить доступ ко всем свойствам (не только заданным в application.properties) из приложения во время его работы.

Источники свойств

Spring Boot приложение может обращаться к свойствам из внешних источников:

Все эти свойства во время работы приложения собираются в бине Environment. Если внедрить бин Environment, то в режиме отладки можно посмотреть все эти списки свойств:

Бин Environment

Бин Environment

Мы для примера попробуем добавить и вывести одно свойство System Properties и пару свойств application.properties. Чаще всего используется именно application.properties.

application.properties

Зададим в application.properties пару свойств:

System Properties

Чтобы задать System Property, на вкладке Run Configuration пропишем VM options:

VM Options

VM Options

Теперь рассмотрим, как получить доступ к этим свойствам из кода.

Доступ к свойствам

Можно внедрить отдельное свойство с помощью @Value. Также можно внедрить же целую серию свойств с помощью класса

Внедрение свойства с помощью @Value

Чтобы внедрить свойство в помощью @Value, используем $:

Мы внедрили свойства:

  • из application.properties
  • и переменную среды TEMP
  • System Property, заданное в VM options

В консоли выводятся значения:

Обратите внимание, что если бы имена свойств случайно совпали, то переменная среды перекрыла бы свойство из application.properties, а System Property перекрыло бы переменную среды. Приоритеты источников указаны по ссылке на все источники свойств выше.

@ConfigurationProperties

Можно также выделить серию свойств из файла application.properties и создать для нее отдельный класс, который можно внедрять. На первый взгляд такой вариант кажется сложнее, но он подходит, если свойств много.

Например, выделим из application.properties свойства, начинающиеся с app (у нас это все свойства, других нет):

Создадим под них класс AppProperties:

Теперь бин AppProperties будет содержать свойства из application.properties. Его можно внедрять и через него получать свойства как поля бина:

Это альтернатива аннотации @Value.

Итоги

Мы рассмотрели, откуда берутся свойства для Spring Boot приложения и как получить к ним доступ. Код примера есть на GitHub.

Читайте также: