2007 年 4 月 3 日 21 時 45 分

フィルタ情報の読み込みと保存


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


前々回書いたように、今回は Filter インスタンスを、
Java のシリアライズ機能を使って読み込み・保存を行う。
そこで、それだけを行う簡単なユーティリティクラスを作ろう。

本来、シリアライズを行う場合、
ObjectOutputStream を使って出力するのだが、
この場合、その出力結果はバイナリデータとなってしまう。
これでは、出力されたデータの内容を確認するのが面倒だ。

そこで、厳密にはシリアライズではないのだが、
java.beans パッケージにある XMLEncoder/XMLDecoder を使い、
XML 形式で出力・入力できるようにしてみよう。

========== FilterManager.java ==========
package jp.loafer.test.util;

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.io.IOException;

import jp.loafer.test.beans.Filter;

public class FilterManager {

    static public Filter load() throws IOException {

        try {
            FileInputStream in =
                    new FileInputStream(PATH);
            try {
                BufferedInputStream bin =
                        new BufferedInputStream(in);
                try {
                    XMLDecoder decoder =
                            new XMLDecoder(bin);
                    try {
                        return (Filter)decoder
                                .readObject();
                    } finally {
                        decoder.close();
                    }
                } finally {
                    bin.close();
                }
            } finally {
                in.close();
            }
        } catch (FileNotFoundException ex) {
            return new Filter();
        }
    }

    static public void save(Filter filter)
            throws IOException {

        FileOutputStream out =
                new FileOutputStream(PATH);
        try {
            BufferedOutputStream bout =
                    new BufferedOutputStream(out);
            try {
                XMLEncoder encoder =
                        new XMLEncoder(bout);
                try {
                    encoder.writeObject(filter);
                    return;
                } finally {
                    encoder.close();
                }
            } finally {
                bout.close();
            }
        } finally {
            out.close();
        }

    }

    static private final String PATH =
            "/etc/packet-filter.xml";

    private FilterManager() {
        //
    }

}

========== end of FilterManager.java ==========

こんな感じか。

設定ファイルは、/etc/packet-filter.xml としているが、
まあこれは適当ってことで。

load メソッドで現在の設定を取り出し、
save メソッドで設定を保存する。
超手抜きの実装ではあるが、
ストリームの扱いは慎重に行っている。

FileInputStream や FileOutputStrem は、
内部で OS 依存のファイル記述子(ハンドル)を扱うので、
確実に close しておく必要がある。

BufferedInputStream や XMLDecoder の close を呼ぶと、
FileInputStream の close を呼び出してくれるので、
数多くの finally 節は冗長にも見えるのだが、
BufferedInputStream や XMLDecoder のコンストラクタで
例外が発生した場合のことを考えておかなければならない。

close を忘れると、GC が走るまで解放されなくなり、
時と場合によっては問題になる可能性があるのだ。

さて、これで役者は揃ったかな?



Copyright (c) 1994-2007 Project Loafer. All rights reserved.