Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений
Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

7.24. Сохранение списка системных свойств

В примере показан способ сохранения списка системных свойств класса Properties в файле и последующего восстановления этого списка из файла. Такой прием может пригодиться вам, например, для хранения в списке системных свойств параметров вашего автономного приложения Java.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

В предыдущем разделе мы рассказали вам о том, как можно получить и изменить таблицу системных свойств класса Properties. Тогда для этого нам потребовалось создавать поток вывода и поток ввода, которые мы расположили в оперативной памяти.

Между тем приложения могут использовать таблицу системных свойств для хранения каких-либо собственных параметров, например, параметров начальной настройки или параметров, установленных пользователем.

Однако изменения в таблице системных свойств действуют только для приложения, которое их изменило. Когда вы завершите работу такого приложения и запустите его вновь, все ранее сделанные изменения в системной таблице свойств пропадут.

Тем не менее, приложение может сохранить измененную таблицу системных свойств в файле, а потом при необходимости восстановить ее. Для этого нужно воспользоваться методами load и save, определенными в класса Properties. В качестве параметров этим методам необходимо передать ссылки, соответственно, на входной и выходной поток, связанный с файлом.

Описание примера

Автономное приложение SaveProperty выполняет описанные выше процедуры сохранения таблицы системных свойств в файле и восстановления этой таблицы из файла. Дополнительно оно позволяет создавать новые элементы в таблице и просматривать ее текущее содержимое (рис. 1).

pic1.gif (6073 bytes)

Рис. 1. Просмотр содержимого таблицы системных свойств в окне приложения SaveProperty

Для выполнения операций с таблицей системных свойств предназначено меню Properties (рис. 2).

pic2.gif (4316 bytes)

Рис. 2. Меню Properties позволяет сохранять, восстанавливать и изменять таблицу системных свойств

Для сохранения текущего содержимого таблицы выберите из этого меню строку Save. На экране появится стандартная диалоговая панель выбора выходного файла.

Чтобы загрузить таблицу системных свойств из файла, воспользуйтесь строкой Load. После ее выбора вы увидите стандартную диалоговую панель выбора входного файла.

Если же выбрать строку Add Item, вы увидите диалоговую панель Add new item (рис. 3).

pic3.gif (2955 bytes)

Рис. 3. Диалоговая панель Add new item

С ее помощью вы можете добавить в таблицу новый элемент или изменить существующий (если укажите в поле Name имя существующего элемента таблицы).

Сразу после изменения в окне нашего приложения отобразится новая таблица свойств (рис. 4).

pic4.gif (4124 bytes)

Рис. 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;
}

Назад Вперед

[Назад]