« TimeZone | Main | Subversionのpost-commit hook »

2007.02.22

DigestOutputStream

 java.security.DigestOutputStreamのJavaDocにおいて、透明なストリームと記載されていますが、果たして「透明な」というのはどういう意味か? ってことで、試してみました。

MessageDigest digest = MessageDigest.getInstance("MD5");
DigestOutputStream dos = new DigestOutputStream(new FileOutputStream("./hoge.txt"), digest);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dos, "MS932"));
writer.write("Hoge");
writer.flush();
byte[] b = digest.digest();
for (int i=0; i<b.length; i++) {
 String s = Integer.toString(b[i] & 0xff, 16);
 if (s.length() == 1) System.out.print("0");
 System.out.print(s);
}
System.out.println("");

ってな感じで出力を行うと、「ファイル出力を行うついでに」Digest値を取得することができます(getInstance(String)の部分でSHA-1等のアルゴリズムに切り替えることができます)。

 これが「透明な」ストリームでなければ、ファイルの出力が完了した後、そのファイルを読み込んで改めてDigest値の算出を行うといった感じで二度手間な処理を行う必要が出てくるかと思います。

 そういう意味では、Jakarta Commons IOのorg.apache.commons.io.output.CountingOutputStreamなども同じような感じですね。出力しながら、実際に出力したバイト数をカウントしてくれます。
 内部で処理した値を取得する等、独自のメソッドを追加する必要があるため、OutputStream等で初期化した場合キャストの必要が生じてきますが、うまく使えばいろいろと便利に使えますね(DigestOutputStreamの場合は、コンストラクタで使用したMessageDigestオブジェクト経由で結果を取得できますが)。

#一応、別のツールで算出したDigest値と同じ結果が得られたので、まぁちゃんと処理できているかと。ちなみに、flush()を忘れると、予期せぬDigest値になってしまいます(^^;

|

« TimeZone | Main | Subversionのpost-commit hook »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference DigestOutputStream:

« TimeZone | Main | Subversionのpost-commit hook »