Назад
Вперед
7.24. Сохранение списка системных свойств
В примере показан способ сохранения списка
системных свойств класса Properties в файле и
последующего восстановления этого списка из
файла. Такой прием может пригодиться вам,
например, для хранения в списке системных
свойств параметров вашего автономного
приложения Java.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
В предыдущем разделе мы рассказали вам о том,
как можно получить и изменить таблицу системных
свойств класса Properties. Тогда для этого нам
потребовалось создавать поток вывода и поток
ввода, которые мы расположили в оперативной
памяти.
Между тем приложения могут использовать
таблицу системных свойств для хранения
каких-либо собственных параметров, например,
параметров начальной настройки или параметров,
установленных пользователем.
Однако изменения в таблице системных свойств
действуют только для приложения, которое их
изменило. Когда вы завершите работу такого
приложения и запустите его вновь, все ранее
сделанные изменения в системной таблице свойств
пропадут.
Тем не менее, приложение может сохранить
измененную таблицу системных свойств в файле, а
потом при необходимости восстановить ее. Для
этого нужно воспользоваться методами load и save,
определенными в класса Properties. В качестве
параметров этим методам необходимо передать
ссылки, соответственно, на входной и выходной
поток, связанный с файлом.
Описание примера
Автономное приложение SaveProperty выполняет
описанные выше процедуры сохранения таблицы
системных свойств в файле и восстановления этой
таблицы из файла. Дополнительно оно позволяет
создавать новые элементы в таблице и
просматривать ее текущее содержимое (рис. 1).
Рис. 1. Просмотр содержимого таблицы системных
свойств в окне приложения SaveProperty
Для выполнения операций с таблицей системных
свойств предназначено меню Properties (рис. 2).
Рис. 2. Меню Properties позволяет сохранять,
восстанавливать и изменять таблицу системных
свойств
Для сохранения текущего содержимого таблицы
выберите из этого меню строку Save. На экране
появится стандартная диалоговая панель выбора
выходного файла.
Чтобы загрузить таблицу системных свойств из
файла, воспользуйтесь строкой Load. После ее выбора
вы увидите стандартную диалоговую панель выбора
входного файла.
Если же выбрать строку Add Item, вы увидите
диалоговую панель Add new item (рис. 3).
Рис. 3. Диалоговая панель Add new item
С ее помощью вы можете добавить в таблицу новый
элемент или изменить существующий (если укажите
в поле Name имя существующего элемента таблицы).
Сразу после изменения в окне нашего приложения
отобразится новая таблица свойств (рис. 4).
Рис. 4. В таблице свойств появился новый элемент
с именем frolov.my.own.item
Рассмотрим наиболее важные фрагменты
исходного текста приложения.
Метод actionPerformed
Метод actionPerformed получает управление после
выбора любой строки главного меню приложения.
Если пользователь выбирает строку Save, метод
actionPerformed сохраняет текущее содержимое таблицы
системных свойств в файле.
Путь выбирается при помощи диалоговой панели
класса FileDialog:
if(e.getSource().equals(miSave))
{
fdlg = new FileDialog(this,
"Save property file as...",
FileDialog.SAVE);
fdlg.setFile("!JavaProperties.jpr");
fdlg.show();
. . .
}
После того как пользователь выберет выходной
файл, метод actionPerformed получает системные свойства
методом getProperties, создает выходной поток класса
FileOutputStream и сохраняет там содержимое таблицы
методом save:
try
{
Properties p = System.getProperties();
FileOutputStream fos =
new FileOutputStream(
fdlg.getDirectory() + fdlg.getFile());
p.save(fos, "Current properties");
fos.close();
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
Выбор входного файла для восстановления
выполняется также с помощью диалоговой панели
класса FileDialog:
else if(e.getSource().equals(miLoad))
{
fdlg = new FileDialog(this,
"Open property file",
FileDialog.LOAD);
fdlg.setFile("*.jpr");
fdlg.show();
. . .
}
Процедура восстановления выполняется методом
load:
try
{
Properties p = System.getProperties();
FileInputStream fis =
new FileInputStream(
fdlg.getDirectory() + fdlg.getFile());
p.load(fis);
fis.close();
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
viewCurrentProperties();
Этому методу передается ссылка на поток,
связанный с выбранным пользователем файлом.
Сразу после восстановления таблицы свойств из
файла она отображается в окне приложения методом
viewCurrentProperties, который мы рассмотрим позже.
Теперь мы рассмотрим процедуру добавления в
таблицу системных свойств нового элемента.
Прежде всего метод actionPerformed создает и
отображает диалоговую панель класса NewItemDialog,
предназначенную для добавления нового элемента:
else if(e.getSource().equals(miAddItem))
{
NewItemDialog nid =
new NewItemDialog("Add new item", this);
nid.show();
String szNewItem = nid.getItem();
. . .
}
Добавленная строка извлекается из панели
методом getItem, определенным в классе NewItemDialog, и
сохраняется в переменной szNewItem.
Далее мы используем методику изменения
таблицы, описанную в предыдущем примере и
основанной на использовании потоков в
оперативной памяти:
Properties p = System.getProperties();
ByteArrayOutputStream os =
new ByteArrayOutputStream();
DataOutputStream dos =
new DataOutputStream(os);
dos.writeBytes(szNewItem);
byte[] buf;
buf = os.toByteArray();
os.close();
ByteArrayInputStream is =
new ByteArrayInputStream(buf);
p.load(is);
Здесь мы вначале загружаем текущую таблицу
методом getProperties, затем мы готовим данные для
потока обновления таблицы, создаем этот поток
как объект класса ByteArrayInputStream и загружаем из
потока новые свойства методом load.
После этого мы отображаем содержимое таблицы
системных свойств в окне нашего приложения
методом viewCurrentProperties:
viewCurrentProperties();
Метод viewCurrentProperties
Для отображения содержимого системной таблицы
свойств мы используем окно многострочного
редактора текста ta, встроенного в главное окно
приложения. Перед обновлением его содержимого мы
очищаем окно ta:
ta.selectAll();
ta.replaceRange("", 0,
ta.getSelectionEnd());
Далее мы получаем таблицу свойств как объект
класса Properties:
Properties p = System.getProperties();
На базе этого объекта мы создаем перечисление
en, вызвав специально предназначенный для
выполнения такой операции метод propertyNames класса
Properties:
Enumeration en = p.propertyNames();
Затем мы перебираем все элементы перечисления
en, добавляя соответствующие строки в окно
текстового редактора ta:
String s;
while(en.hasMoreElements())
{
s = (String)en.nextElement();
ta.append(s + "=" +
p.getProperty(s) + "\n");
}
Здесь в переменную s записывается имя свойства,
а значение определяется по этому имени с помощью
метода getProperty.
Класс NewItemDialog
Класс NewItemDialog создан на базе класса Dialog и
предназначен для создания панели добавления
нового элемента в таблицу системных свойств.
Мы не будем подробно останавливаться на его
исходном тексте, так как аналогичные панели уже
встречались ранее в наших примерах. Отметим
только самые важные моменты.
Конструктор класса создает два однострочных
текстовых редактора, два поля класса Label и две
кнопки. Эти компоненты располагаются в окне
диалоговой панели с использованием режима
размещения компонент GridBagLayout.
Когда пользователь нажимает кнопку OK или Cancel,
управление передается методу actionPerformed.
В ответ на нажатие кнопки OK метод actionPerformed
извлекает содержимое полей редактирования и,
если они не пустые, записывает строку
добавляемого свойства в переменную szNewItem:
if(e.getSource().equals(bOK))
{
String szName = tfName.getText();
String szValue = tfValue.getText();
if(!szName.equals("")
&& !szValue.equals(""))
szNewItem = szName + "=" + szValue;
else
szNewItem = null;
setVisible(false);
}
Затем диалоговая панель скрывается методом
setVisible.
Что же касается кнопки Cancel, то соответствующий
фрагмент кода метода actionPerformed в ответ на ее
нажатие записывает в поле szNewItem значение null. А
затем скрывает окно диалоговой панели:
else if(e.getSource().equals(bCancel))
{
szNewItem = null;
setVisible(false);
}
Для извлечения строки szNewItem в классе NewItemDialog
предусмотрен метод getItem:
public String getItem()
{
return szNewItem;
}
Назад Вперед |