— Сегодня мы изучаем еще одну новую и интересную тему – свойства (properties).

Properties - 1

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

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

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

Пример
Файл data.properties
directory=c:/text/downloads
email=zapp@javarush.ru

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

— Т.е. это что-то типа текстового представления HashMap?

— В общем-то, да.

Для удобной работы с такими файлами в 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.

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

Код
//файл, который хранит свойства нашего проекта
File file = new File("c:/data.properties");

//создаем объект Properties и загружаем в него данные из файла.
Properties properties = new Properties();
properties.load(new FileReader(file));

//получаем значения свойств из объекта Properties
String email = properties.getProperty("email");
String directory = properties.getProperty("directory");

//получаем числовое значение из объекта Properties
int maxFileSize = Integer.parseInt(properties.getProperty("max.size", "10000"));

— Ага. Т.е. мы создаем объект Properties, затем передаем в него файл. В метод load, а затем просто вызываем getProperty. Так?

— Ага.

— А ты еще говорил, что им можно пользоваться как HashMap? Что ты имел в виду?

— Класс Properties унаследован от Hashtable, а это – тот же HashMap, просто все методы его синхронизированы. Вот так можно просто вывести на экран все значения из файла свойств:

Код
//получаем файл со свойствами
File file = new File("c:/data.properties");

//создаем объект Properties и загружаем в него данные из файла.
Properties properties = new Properties();
properties.load(new FileReader(file));

//проходимся по всем ключам и печатаем все их значения на консоль
for (String key : properties.stringPropertyNames())
{
 System.out.println(properties.get(key));
}

— Ага. Вроде все стало на свои места. Спасибо, Риша, буду пользоваться такой крутой штукой.