SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

XMLEncoderとXMLDecoderを使用したデータの書き出しと復元

簡単な方法でXML形式のファイル保存を実現する


  • このエントリーをはてなブックマークに追加

ダウンロード サンプルコード (4.7 KB)

アプリケーションで作成したデータをファイルに書き出す仕組みと、そのファイルからデータを復元する仕組みを簡単に実装する方法として、XMLEncoderクラスとXMLDecoderクラスを活用する手法を紹介します。

  • このエントリーをはてなブックマークに追加

はじめに

 アプリケーションで作成したデータを、次回アプリケーションを起動した時に再び利用したい場合、データをファイルに書き出す仕組みと、ファイルからデータを復元する仕組みが必要になります。それでは、この仕組みはどのように実現するのが良いでしょう。

 オリジナルのアプリケーションでは、自分で自由に仕様(ファイルフォーマット)を決定することができます。一般的には、カンマや改行でデータを区切った単純なテキストファイルとして保存することが多いのではないでしょうか。しかし、自分でファイルフォーマットを決定したり、それに対応した読み込みの機能を実装するのは手間のかかる作業です。さらに、アプリケーションのバージョンアップに伴うファイルフォーマットの拡張にも柔軟に対応できるようにすることは、とても大変です。拡張性という観点からはXML形式でファイルを保存することが考えられますが、XMLの扱いを習得するのもやはり大変です。

 そこで本稿では、JDK 1.4から追加されたXMLEncoderクラスを使用してデータをXML形式で書き出す方法と、XMLDecoderクラスを使用してファイルからデータを復元する方法を紹介します。この2つのクラスを活用すると、ファイルの保存にまつわる諸問題を簡単に解決できてしまいます。

 実装は簡単なので知っていると非常に便利ですが、意外と知らない方も多いのではないかと思い、ここで紹介したいと思います。

シリアライズとの違い
 オブジェクトの状態をファイルに書き出す方法として、シリアライズ機能がJavaには備わっています。これはjava.io.Serializableインターフェイスを実装することで、オブジェクトをバイトストリームの形で入出力できる機能です。このシリアライズによって、データの書き出しと復元が可能ですが、オブジェクトのバージョンが異なると互換性を維持できないという拡張性の点で問題があります。後から内容を追加しても互換性が維持できるという点では、XMLEncoderXMLDecoderを用いてXML形式でファイルに書き出す方が優れています。

対象読者

 データの読み書きが必要なJavaアプリケーションの開発に興味のある人。XML形式について興味のある人。

必要な環境

 J2SE Development Kit(JDK) 1.4以上。

XMLEncoderを使用したデータの書き出し

 まず具体的な例として、ゲームの得点とユーザー名をファイルに保存する例を紹介します。この例では、ゲームの得点とユーザー名の情報を保持するDataSetクラスと、そこに格納されたデータをファイルに書き出すXMLEncoderTestクラスを作成します。

 DataSetクラスのコードは次のようになります。

DataSet.java
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がデータの書き出しと復元を行うために必ず定義しておく必要があります。

JavaBeansとの関係
 JavaBeansを用いたプログラムを作成したことがある方は、Beanの定義と同じであることに気付くと思います。ご想像の通り、XMLEncoderはBeanをXML形式に変換するためのクラスなのです。以降で紹介するXMLEncoderクラスはjava.beansパッケージに含まれています。

 それでは実際にXMLEncoderを使用してファイルにDataSetオブジェクトの内容を書き出すプログラムを見てみましょう。最も簡単な例は次のようになります。

XMLEncoderTest.java
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」というファイルが作成されます。

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形式で保存されていることを確認できます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
XMLDecoderを使用したデータの読み込み

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

三谷 純(ミタニ ジュン)

Javaとの出会いは1996年にJDK1.0が登場した時までさかのぼります。それ以降、アプレットやスタンドアロンのアプリケーション、JSPを用いたサーバサイドのサービスや携帯電話で動くJavaアプリの開発など、広い範囲でJavaに関するプログラミングを行っています。拙著『独りで習うJava』は初めてJava...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/371 2006/10/10 14:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング