Укрощаем "Тигра": Загрузка параметров из XML

Укрощаем "Тигра": Загрузка параметров из XML

Совсем недавно компания Sun Microsystems выпустила бета-версию J2SE 1.5 под кодовым названием Tiger. Своим появлением этот релиз привнес в Java, как и ожидалось, огромное количество улучшений и новых возможностей. Все очень долго ждали этого момента, и наконец это произошло… Ожидания оправдались. От бурных обсуждений предварительного списка нововведений все перешли к практическому использованию их в своих приложениях.

Из этой статьи вы узнаете, как можно очень просто загружать и сохранять параметры в XML-файлы. Речь пойдет о классе Properties. Именно он обычно используется в качестве контейнера, в котором хранятся всевозможные настройки и собственно параметры приложения. Со времени появления первых версий Java этот класс практически не изменился. Но с появлением J2SE 1.5 мы можем не только хранить его содержимое в файлах, представленных в виде строк "<ключ> =<значение> ", но и в XML-файлах. И в самом деле было бы неправильно не реализовать эту возможность, учитывая тот факт, что еще в версии 1.4 был встроенный XML-парсер.

Для тех, кто не знаком с классом java.util.Properties, рассмотрим сначала, что это такое. Как уже упоминалось, этот класс хранит набор ключей и значений, разделенных знаком равенства "=". Например:

name=alex
weight=71

Здесь у нас две пары. Первая задает имя, вторая — вес. Причем name и weight — это ключи, а alex и 71 — значения. Класс Properties поддерживает Unicode, поэтому вы можете использовать строки со специальными символами для вставки нужных вам символов.

Далее попробуем прочитать и вывести эти значения, которые мы, предположим, занесли в один из файлов. Пусть это будет props.txt. Ниже приведен листинг программы, которая читает значения из файла и выводит их на экран:

import java.util.*;
import java.io.*;

public class LoadSample {
public static void main(String args[]) throws Exception {
Properties prop = new Properties();
FileInputStream fis = new FileInputStream("props.txt");
prop.load(fis);
prop.list(System.out);
System.out.println("\nПараметр name: " + prop.getProperty("name"));
}
}

Если мы скомпилируем и запустим этот пример, то на экране получим следующее:

- listing properties --
name=alex
weight=71

Параметр name: alex

Загрузка из XML
Думаю, ничто из вышесказанного не было для вас новостью, поэтому перейдем непосредственно к рассмотрению XML-варианта хранения параметров. Для определения формата XML для хранения параметров используется следующий DTD:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT properties ( comment?, entry* ) >
<!ATTLIST properties version CDATA #FIXED "1.0">
<!ELEMENT comment (#PCDATA) >
<!ELEMENT entry (#PCDATA) >
<!ATTLIST entry key CDATA #REQUIRED>

DTD задает структуру конкретного XML-формата, в нашем случае — XML-файла для хранения параметров. Структура (на случай, если кто не может читать DTD-документы) следующая: корневой элемент документа — properties, в котором может быть один элемент comment (а может и не быть), и любое количество элементов entry. Для каждого элемента entry задается атрибут, определяющий ключ (key), а содержимое элемента entry — это значение (value).

Пример XML-файла с параметрами:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment> Hi</comment>
<entry key="name"> alex</entry>
<entry key="weight"> 71</entry>
</properties>

Далее следует пример программы, которая загружает данные из этого XML-файла и выводит их на экран.

import java.util.*;
import java.io.*;

public class LoadSampleFromXML {
public static void main(String args[]) throws Exception {
Properties prop = new Properties();
FileInputStream fis = new FileInputStream("props.xml");
prop.loadFromXML(fis);
prop.list(System.out);
System.out.println("\nПараметр name: " + prop.getProperty("name"));
}
}

Эта программа выводит в точности то же самое, что и предыдущий пример с загрузкой из обычного текстового файла.

Сохранение в XML
Вполне логично, что сохранение содержимого в XML-файл объекта Properties будет таким же простым, как и загрузка. В то время, как метод store() используется для сохранения данных в текстовом файле в виде строк с парами, новый метод storeToXML() создает XML-файл в рассмотренном выше формате, в который занесет данные из объекта. Для этого методу storeToXML() достаточно передать объект класса OutputStream и String в качестве комментария, и готово. Ниже приведен листинг примера:

import java.util.*;
import java.io.*;

public class StoreXML {
public static void main(String args[]) throws Exception {
Properties prop = new Properties();
prop.setProperty("name", "alex");
prop.setProperty("weight", "71");
FileOutputStream fos = new FileOutputStream("props.xml");
prop.storeToXML(fos, "Здесь может быть комментарий.");
fos.close();
}
}

Как видно из примера, сначала мы задаем параметры во вновь созданном объекте, потом открываем файловый поток и вызываем метод storeToXML() для сохранения параметров в XML-файле. После этого закрываем файл. Все просто.

Выбор между использованием XML или обычного текстового файла лежит целиком на вас.
Старый подход (пары <ключ> =<значение> ), без сомнений, быстрее и требует значительно меньше системных ресурсов.
Однако следует учесть популярность XML, его повсеместное использование и внедрение. XML сегодня — это фактический стандарт хранения любых структурированных данных.

Тем более, что с сегодняшней производительностью компьютеров мы можем смело использовать XML в качестве средства для хранения параметров и настроек своих приложений, и не только.

Скачать J2SE 1.5 (Tiger) можно здесь: http://java.sun.com/j2se/1.5.0/ .

По материалам John Zukowski
Алексей Литвинюк, litvinuke@tut.by



Компьютерная газета. Статья была опубликована в номере 16 за 2004 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета