— Сьогодні ми вивчаємо ще одну нову та цікаву тему – властивості (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 = новий 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 = новий 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));
}

— Ага. Наче все стало на свої місця. Дякую, Ріша, користуватимуся такою крутою штукою.