はじめに
アプリケーションで作成したデータを、次回アプリケーションを起動した時に再び利用したい場合、データをファイルに書き出す仕組みと、ファイルからデータを復元する仕組みが必要になります。それでは、この仕組みはどのように実現するのが良いでしょう。
オリジナルのアプリケーションでは、自分で自由に仕様(ファイルフォーマット)を決定することができます。一般的には、カンマや改行でデータを区切った単純なテキストファイルとして保存することが多いのではないでしょうか。しかし、自分でファイルフォーマットを決定したり、それに対応した読み込みの機能を実装するのは手間のかかる作業です。さらに、アプリケーションのバージョンアップに伴うファイルフォーマットの拡張にも柔軟に対応できるようにすることは、とても大変です。拡張性という観点からはXML形式でファイルを保存することが考えられますが、XMLの扱いを習得するのもやはり大変です。
そこで本稿では、JDK 1.4から追加されたXMLEncoder
クラスを使用してデータをXML形式で書き出す方法と、XMLDecoder
クラスを使用してファイルからデータを復元する方法を紹介します。この2つのクラスを活用すると、ファイルの保存にまつわる諸問題を簡単に解決できてしまいます。
実装は簡単なので知っていると非常に便利ですが、意外と知らない方も多いのではないかと思い、ここで紹介したいと思います。
java.io.Serializable
インターフェイスを実装することで、オブジェクトをバイトストリームの形で入出力できる機能です。このシリアライズによって、データの書き出しと復元が可能ですが、オブジェクトのバージョンが異なると互換性を維持できないという拡張性の点で問題があります。後から内容を追加しても互換性が維持できるという点では、XMLEncoder
とXMLDecoder
を用いてXML形式でファイルに書き出す方が優れています。対象読者
データの読み書きが必要なJavaアプリケーションの開発に興味のある人。XML形式について興味のある人。
必要な環境
J2SE Development Kit(JDK) 1.4以上。
XMLEncoderを使用したデータの書き出し
まず具体的な例として、ゲームの得点とユーザー名をファイルに保存する例を紹介します。この例では、ゲームの得点とユーザー名の情報を保持するDataSet
クラスと、そこに格納されたデータをファイルに書き出すXMLEncoderTest
クラスを作成します。
DataSet
クラスのコードは次のようになります。
public class DataSet { private int score; private String name; public DataSet() { score = 0; name = "No Name"; } public DataSet(int score, String name) { this.score = score; this.name = name; } public void setScore(int i) { score = i; } public int getScore() { return score; } public void setName(String s) { name = s; } public String getName() { return name; } }
上記のコードを上から順番に見ていきます。
まず、DataSet
クラスは、int型のscore
とString型のname
をメンバ変数(プロパティ)として持ちます。この変数は、後で述べるアクセッサを用いてアクセスするためprivate
属性にしておきます。
続いて、引数無しのコンストラクタ(デフォルトコントラスタ)を定義します。引数無しのコンストラクタは必ず定義しておく必要があります。その下で引数のあるコンストラクタを定義していますが、これは無くても構いません。
最後にメンバ変数にアクセスするためのアクセッサを定義しています。アクセッサとは次のような命名規則に則ったメソッドのことで、それぞれ変数(プロパティ)の値を取得するためのメソッド、変数に値を設定するためのメソッドです。
- set変数名 (変数の値を設定する)
- get変数名 (変数の値を取得する)
(変数の型がboolean型の場合は「get変数名」の代わりに「is変数名」とすることもできます)
これらのメソッドは、XMLEncoderがデータの書き出しと復元を行うために必ず定義しておく必要があります。
XMLEncoder
はBeanをXML形式に変換するためのクラスなのです。以降で紹介するXMLEncoder
クラスはjava.beans
パッケージに含まれています。 それでは実際にXMLEncoder
を使用してファイルにDataSet
オブジェクトの内容を書き出すプログラムを見てみましょう。最も簡単な例は次のようになります。
import java.beans.XMLEncoder; import java.io.*; public class XMLEncoderTest { final static String FILE_NAME = "test.xml"; public static void main(String[] args) { DataSet dataSet = new DataSet(100, "太郎"); try { XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream( new FileOutputStream(FILE_NAME))); encoder.writeObject(dataSet); encoder.close(); } catch(Exception e) { e.printStackTrace(); } } }
まず、保存対象となるデータを保持したDataSet
クラスのインスタンスを次のように生成します。
new DataSet(100, "太郎");
続いてXMLEncoder
のインスタンスを作成した後は、writeObject
メソッドの引数に作成したDataSet
クラスのインスタンスを渡し、close
メソッドを呼び出します。この2つのメソッドだけでファイルへの書き出しが完了してしまいます。コードの記述はとても簡単なことが分かります。
実際に、このXMLEncoderTest
を実行すると次のような内容の「test.xml」というファイルが作成されます。
<?xml version="1.0" encoding="UTF-8"?> <java version="1.5.0_02" class="java.beans.XMLDecoder"> <object class="DataSet"> <void property="name"> <string>太郎</string> </void> <void property="score"> <int>100</int> </void> </object> </java>
得点とユーザー名が自動的にXML形式で保存されていることを確認できます。