![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
AntonSaburov |
|
||||||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Использование Preferences API
Оригинал статьи - Preferences API Существует немало случаев, когда программисту необходимо сохранять какие-нибудь конфигурационные параметры. Раньше это можно было сделать используя класс java.util.Properties. Поначалу это выглядело не так уж плохо, но тем не менее на программиста ложилась задача где разместить конфигурационный файл. PreferencesAPI появился в Java 1.4 и по словам Sun призван обеспечить более удобный способ хранения и восстановления каких-либо настроек (для пользователя или системы). И теперь такого понятия как конфигурационный файл по сути нет. Насколько это хорошо, что нет конфигурационного файла – вопрос открыт. Но система позволяет вам не просто хранить данные, но и делать экспорт/импорт – вы получаете приятный XML, который можно переносить вместе с приложением. И что еще более важно – теперь система позволяет делать не «плоский» конфигурационный файл, а иерархическую структуру. Давайте немного рассмотрим как устроено сохрание данных изнутри. Данные настроек пользователя организуются в виде иерархической коллекции узлов – по сути это дерево. Существует два типа деревьев – для пользователя и для системы. Надо также отметить, что для каждого пользователя организуется своя иерархия данных пользователя. Для системы она одна для всех пользователей. Техника работы с обоими типами деревьев одинакова. Потму мы рассмотрим примеры для пользовательского дерева настроек. Я запускал все примеры под Windows XP – для данной ОС конфигурация хранится в реестре. Вы можете запустить программу regedit и открыть ветку HKEY_CURRENT_USER\Software\JavaSoft\Prefs Если ее там пока нет – не волнуйтесь, появится. Для Linux создается каталог $HOME/.java/.userPrefs, внутри которого уже создается иерархия из директорий и конечного файла XML. Давайте сразу рассмотрим несложный пример:
Этот код позволяет нам получить экземпляр объекта Preferences который можно использовать для чтения или записи данных. В данном случае мы будем сохранять и восстанавливать размеры JFrame. Это показано в следующем примере, где мы рассмотрим все более подробно. В нем мы создаем форму с определенными значениями ширины и высоты (100, 200), после этого мы записываем новые значения (400, 500) и при повторном запуске мы получаем их из нашего хранилища.
Давайте внимательно рассмотрим основные моменты в программе. Во-первых – конструктор. Здесь мы видим. что для начала работы необходимо получить обработчик Preferences для класса. Вызов userPrefs = Preferences.userRoot().node("prefexample"); создает ветку HKEY_CURRENT_USER\Software\JavaSoft\Prefs\prefexample Выше мы приводили еще один вариант создания ветки. В этом случае имя будет по умолчанию HKEY_CURRENT_USER\Software\JavaSoft\Prefs\<unnamed> Не знаю как создателям, а мне невозможность выбора имени не понравилась. Потому и нашел тот вызов который представлен выше. Если посмотреть API для класса Preferences, то можно найти немало интересного – что я вам советую сделать после прочтения (если конечно есть время и желание). В принципе вся остальная информация основана именно на этом API. Во-вторых – в том же конструкторе мы делаем вызов метода setToPreferredSize(). В этом методе мы пытаемся получить параметры по именам. Причем мы указываем не только имя, но и тип – getInt – т.е. просим именно целое число. Preferences включает методы для получения разных типов данных – целые, вещественные, логические, байтовые массивы. Вызов getInt также включает указание значения по умолчанию – если параметр не будет найден. Таким образом при запуске мы сразу создаем форму и пытаемся в ее конструкторе получить данные из хранилища. Т.к. там еще ничего нет (при первом запуске) то форма получается в размерами 100 на 200. После этого мы делаем вызов putDimensions, который сохраняет новые значения ширины и высоты. Вызовы достаточно просты для понимания – там всего два параметра, имя и значение. Думаю, что после запуска надо посмотреть в реестр и увидеть. что там изменилось. Еще раз вернемся к вызову userPrefs = Preferences.userRoot().node("prefexample"); Что здесь очень инетересно, так это то. что вызов node возвращает объект Preferences, который опять же имеет вызов node. Как легко можно увидеть, это дает нам возможность строить дерево конфигурации – иерархическую структуру. И класс Preferences предоставляет все необходимое для работы с деревом. Это и получение родителя для узла, и получение списка «детей» и другие методы. Посмотрите результаты вызова userPrefs = Preferences.userRoot().node("prefexample").node(“1”); На что я еще хотел бы обратить ваше внимание – Preferences API имеет листенер для отслеживания изменения параметров. Для этого надо реализовать интерфейс PreferenceChangeListener. Давайте посмотрим несложный пример, который с определенным интервалом меняет высоту и ширину формы, но будет это делать не напрямую, а путем отслеживания изменений сохраненных параметров. Комментарии будут приведены прямо в тексте – я думаю, что это будет удобнее. Порядок просмотра советую выбрать такой – сначала посмотрите на конструктор (вообщем-то он не очень сильно изменился). А потом сразу идите в метод resetDimensionsManyTimes. В нем мы в цикле через определенный интервал времени меняем значения параметров и сохраяем их в реестре. При сохранении вызывается обработчик preferenceChange, который считывает новые значение и устанавливает новые размеры формы. Также приведен пример экспорта данных в файл.
Вот и все, что я хотел бы вам рассказать про новое Preferences API. Все пожелания автор принимает с удовольствием. |
||||||
|
|||||||
Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
||||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Надо будет посмотреть - пока не знаю.
А почему бы нет - если сервер (WEB или Application) запускается из под определенного пользователя, то получать данные вполне можно. Кроме того существует экспорт/импорт, которые решают проблему начальной настройки достаточно просто. |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
В никсах это текстовые файлики. Пользовательские хранятся в хомяке, системные - в /etc. -------------------- ![]() ![]() |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Добавил в статью строки о Linux
Для Linux создается каталог $HOME/.java/.userPrefs, внутри которого уже создается иерархия из директорий и конечного файла XML. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
На сервере нет нужды отказываться от java.util.Properties, которые всегда известно где лежат и которые легко отредактировать при необходимости любым текстовым редактором. PreferenceAPI, на мой взгляд, удобна для клиентских приложений, причем, для хранения текущих установок. Например, размеров открытых окон и их положений, т.е. внутренних параметров, которые вручную врядли кто будет редактировать. Да и сложно их отыскать, потому что место хранения определяется системой. Для клиентских же приложений, имеющих постоянное соединение с сервером, а также распространяемых через интернет (апплеты, jnlp) имеет смысл сохранять такие установки на сервере. Я пока не нашел применения PreferenceAPI.
Это сообщение отредактировал(а) COVD - 5.2.2008, 17:36 |
|||
|
||||
Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
COVD
Согласен. Под это скорее всего и затачивалось. AntonSaburov Спасибо за статью. Полезно было узнать, сам бы вряд ли натолкнулся, а так на блюдечке... ![]() w1nd Ага, спасибо. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |