このアーカイブは同期化されません。 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 が走るまで解放されなくなり、
時と場合によっては問題になる可能性があるのだ。
さて、これで役者は揃ったかな?