- Примеры работы с Java Properties
- Загрузка из файлов XML
- Как получить свойства?
- Как установить свойства
- Удалить свойства
- Хранение Properties
- Хранение в XML-файлах
- How to Create and Modify Properties File Form Java Program in Text and XML Format — Example
- Java program to create and store Properties in text and XML format
Примеры работы с Java Properties
Большинству программ Java в какой-то момент необходимо использовать свойства, как правило, для хранения простых параметров в виде пар ключ-значение вне скомпилированного кода.
Таким образом, язык имеет поддержку класса для свойств – java.util.Properties – служебный класс, предназначенный для обработки файлов конфигурации этого типа.
В этой статье я покажу использование базового класса Properties, в том числе способы загрузки и сохранения в формате XML, как управлять парами ключ-значение в объекте свойств, например извлекать значения, обновлять, получить его размер и как использовать список по умолчанию для объекта.
- Properties является подклассом Hashtable. Он используется для ведения списков значений, в которых ключ является строкой, а значение также является строкой.
- Класс Properties используется многими другими классами Java. Например, это тип объекта, возвращаемый System.getProperties() при получении значений.
- Одна полезная возможность класса состоит в том, что вы можете указать свойство по умолчанию, которое будет возвращаться, если никакое значение не связано с определенным ключом.
- Несколько потоков могут совместно использовать один объект без необходимости внешней синхронизации.
- Properties определяет переменную экземпляра.
- Properties() создает объект Properties, который не имеет значений по умолчанию.
- Properties (Properties propDefault): второй создает объект, который использует propDefault в качестве значения по умолчанию.
Начнем с примера загрузки пар ключ-значение из файлов свойств; мы загружаем два файла, которые мы имеем в нашем classpath:
version=1.0 name=TestApp date=2016-11-12
c1=files c2=images c3=videos
Обратите внимание, что в файлах свойств рекомендуется использовать “.properties”, в suffix это не обязательно.
Теперь мы можем очень просто загрузить их в экземпляр 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.
Загрузка из файлов 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"));
Как получить свойства?
Мы можем использовать 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() будет возвращать значение Object, которое может быть приведено только к String, а метод getProperty() уже обрабатывает значение Object правильно.
Код ниже выдаст исключение:
float appVerFloat = (float) appProps.get(«version»);
Как установить свойства
Мы можем использовать метод setProperty(), чтобы обновить существующую пару ключ-значение или добавить новую.
appProps.setProperty("name", "NewAppName"); // обновить старое значение appProps.setProperty("downloadAddr", "www.baeldung.com/downloads"); // добавить новую пару ключ-значение String newAppName = appProps.getProperty("name"); assertEquals("NewAppName", newAppName); String newAppDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("www.baeldung.com/downloads", newAppDownloadAddr);
Класс Properties наследует метод put() и метод putAll() от класса Hashtable, я не рекомендую использовать их по той же причине, что и для метода get(): в свойствах могут использоваться только строковые значения.
Приведенный ниже код не будет работать так, как вы хотите, когда вы используете getProperty() для получения его значения, он вернет null:
appProps.put(«version», 2);
Удалить свойства
Если вы хотите удалить пару ключ-значение, вы можете использовать метод remove().
String versionBeforeRemoval = appProps.getProperty("version"); assertEquals("1.0", versionBeforeRemoval); appProps.remove("version"); String versionAfterRemoval = appProps.getProperty("version"); assertNull(versionAfterRemoval);
Хранение Properties
Класс Properties предоставляет метод store() для вывода пар ключ-значение.
String newAppConfigPropertiesFile = rootPath + "newApp.properties"; appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");
Второй параметр используется для комментариев. Если вы не хотите писать какой-либо комментарий, просто используйте для него значение null.
Хранение в XML-файлах
Класс Properties также предоставляет метод storeToXML() для вывода пар ключ-значение в формате XML.
String newAppConfigXmlFile = rootPath + "newApp.xml"; appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");
Второй параметр такой же, как и в методе store().
Объект Properties может содержать другой объект Properties в качестве списка свойств по умолчанию. Список свойств по умолчанию будет найден, если ключ свойства не найден в исходном.
Помимо “app.properties”, у нас есть еще один файл – “default.properties” – в classpath:
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);
По умолчанию файлы свойств должны быть в кодировке ISO-8859-1 (Latin-1), поэтому обычно не следует использовать свойства с символами не из ISO-8859-1.
Мы можем обойти это ограничение с помощью таких инструментов, как JDK native2ascii или явное кодирование файлов, если это необходимо. Для файлов XML метод loadFromXML() и метод storeToXML() по умолчанию используют кодировку UTF-8.
Однако при чтении XML-файла, закодированного по-другому, мы можем указать это в объявлении DOCTYPE; запись также достаточно гибкая – мы можем указать кодировку в третьем параметре API storeToXML().
Полный исходный код проекта доступен на GitHub
Средняя оценка 4.2 / 5. Количество голосов: 20
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
How to Create and Modify Properties File Form Java Program in Text and XML Format — Example
Though most of the time we create and modify properties file using text editors like notepad, word-pad or edit-plus, It’s also possible to create and edit properties file from Java program. Log4j.properties , which is used to configure Log4J based logging in Java and jdbc.properties which is used to specify configuration parameters for database connectivity using JDBC are two most common example of property file in Java. Though I have not found any real situation where I need to create properties file using Java program but it’s always good to know about facilities available in Java API.
In last Java tutorial on Properties we have seen how to read values from properties file on both text and XML format and in this article we will see how to create properties file on both text and XML format.
Java API’s java.util.Properties class provides several utility store() methods to store properties in either text or xml format. Store() can be used to store property in text properties file and storeToXML() method can be used for creating a Java property file in XML format.
Java program to create and store Properties in text and XML format
As I said earlier java.util.Properties represent property file in Java program. It provides load() and store() method to read and write properties files from and to the File system. Here is a simple example of creating Java property file form program itself.
import java.io.FileNotFoundException ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.util.Properties ;
/**
* Java program to create and modify property file in text format and storing
*
* @author Javin Paul
*/
public class TextPropertyWriter
public static void main ( String args []) throws FileNotFoundException, IOException
//Creating properties files from Java program
Properties props = new Properties () ;
FileOutputStream fos = new FileOutputStream ( «c:/user.properties» ) ;
props. setProperty ( «key1» , «value1» ) ;
props. setProperty ( «key2» , «value2» ) ;
//writing properites into properties file from Java
props. store ( fos, «Properties file generated from Java program» ) ;