Cazperのつれづれ日記: XMLEncoderとXMLDecoderを利用したXMLファイルの読み込みと書き出し

« 執務室へ最初に入り込んだ者が、工場を乗っ取れる | メイン | 共生のための競争であって、適者生存のための競争ではない »

2009年3月12日

panda01.gif XMLEncoderとXMLDecoderを利用したXMLファイルの読み込みと書き出し

Javaはプラットフォーム依存をしないように作られているので、設定データ保存に関してWindowsでお得意のiniファイルやレジストリを利用するのではなくXMLファイルに書き出すことが普通なようです。

int、doubleなどの基本型だけでなく、オブジェクト型のデータのXMLファイルへの書き出しがサポートしているようです。

デフォルトで XML への書き出しがサポートされているクラスには Swing のコンポーネントを始め AWT や Swing 関連のクラスが多いのですが他にも Vector, ArrayList, LinkedList, HashSet, TreeSet, TreeMap, HashMap, Hashtable などは要素あるいはキーと値のペアが XML に書き出されます。 (AbstractCollection, AbstractList, AbstractMap のサブクラスや Hashtable やそのサブクラスであれば要素あるいはキーと値のペアが XML に保存されます。jdk1.5.0)(引用元)


簡単なサンプルプログラムを作成してみました。構成は以下の通り
●DataSet.java・・・データセットを定義し、データを保持します。
●XMLStream.java・・・実際のファイル書き出し・読み込みを行います。
●Main.java・・・メインの関数です。
Main.javaからXMLStream内の関数を呼び出して、DataSetで保持されたデータの書き出しやXMLファイルの読み込みを行います。

データを保持するDataSet.javaは一定の規則を守る必要がある模様。

ファイルに保存するデータを保持するクラス(今回の例ではDataSetクラス)を定義します。ただし、このクラスは次のような決まりを守る必要があります。

* 引数のないデフォルトコントラスタが定義されている
* 変数に対するアクセッサ(set変数名、get変数名という名前のメソッド)が定義されている(CodeZine)

実際のサンプル・コードを見てみましょう。
●DataSet.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package xmlencodertest;

import java.util.ArrayList;

/**
*
* @author Cazper
*/
public class DataSet {

private int value;
private String name;
private ArrayList lists;

public DataSet() {
value = 0;
name = "Default Name";
lists = new ArrayList();
}

public DataSet(int power, String name, ArrayList lists) {
this.value = power;
this.name = name;
this.lists = lists;
}

public void setValue(int i) {
value = i;
}

public int getValue() {
return value;
}

public void setName(String s) {
name = s;
}

public String getName() {
return name;
}

public void setLists(ArrayList a){
lists = a;
}

public ArrayList getLists(){
return lists;
}

}

ArrayListはArrayList自体をコピーするようなset関数を用意します。


●XMLStream.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package xmlencodertest;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;

/**
* ファイルの読み込み、書き出し部
* @author Cazper
*/
public class XMLStream {

/* XMLファイル */
private String strFile;

/**
*
*/
public XMLStream(String strFile){
this.strFile = strFile;
}

/**
* オブジェクトデータをXMLに出力する。
*/
public void writeXML() {

ArrayList list = new ArrayList();
list.add("のびた");
list.add("すねお");

DataSet dataSet = new DataSet(100, "ジャイアン", list);

try {
XMLEncoder encoder = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream(strFile)));
encoder.writeObject(dataSet);
encoder.close();
} catch(Exception e) {
e.printStackTrace();
}

}

/**
* オブジェクトにXMLデータを入力する。(ファイルを読み込む)
*/
public void readXML() {

DataSet dataSet = null;
try {
XMLDecoder dec = new XMLDecoder(
new BufferedInputStream(
new FileInputStream(strFile)));
dataSet = (DataSet)dec.readObject();
dec.close();
} catch(FileNotFoundException e) {
e.printStackTrace();
return;
}

System.out.println("value=" + dataSet.getValue());
System.out.println("name=" + dataSet.getName());
System.out.println("name1=" + dataSet.getLists().get(0));
System.out.println("name2=" + dataSet.getLists().get(1));

}

}


●Main.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package xmlencodertest;

/**
* Main部分
* @author Cazper
*/
public class Main {

/* XMLファイル */
private static String strFile = "test.xml";

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
XMLStream xmlStream = new XMLStream(strFile);

//書き出す
xmlStream.writeXML();
//読み込む
xmlStream.readXML();
}

}


実際に保存されたXMLファイル(test.xml)は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_06" class="java.beans.XMLDecoder">
<object class="xmlencodertest.DataSet">
<void property="lists">
<void method="add">
<string>のびた</string>
</void>
<void method="add">
<string>すねお</string>
</void>
</void>
<void property="name">
<string>ジャイアン</string>
</void>
<void property="value">
<int>100</int>
</void>
</object>
</java>


<参考>
・CodeZine:XMLEncoderとXMLDecoderを使用したデータの書き出しと復元
・Bean Persistence:XML に保存可能なオブジェクト(魚拓)
・プログラミング・ノウハウ集 ~ JAVA 編 (1):JavaとXMLファイルのデータ連携
Class XMLEncoder
Class XMLDecoder

投稿者 cazper : 2009年3月12日 12:30 | b_entry.gif
     

トラックバック

このエントリーのトラックバックURL:
http://www.cazoo.jp/cgi/mt/mt-tb.cgi/2469

コメント