2004/10/21

今日の Java

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

System.in/out/err

普通、ストリームや Reader/Writer は使い終わったらクローズしますよね。

でも、System.in や out から取得した Reader/Writer はクローズしていいのでしょうか?

答え いけません

クローズした後は、そのプロセスでは System.in/out/err は使えなくなってしまいます。

でも、Reader/Writer が System.in/out に由来するものなのか気にするのは面倒です。そんなときはせっかくのデコレータパターンなので、close したけど close しないクラスを作ってしまいましょう。

たとえば、System.out を使うようなクラスとして StandardOuputStream クラスを作ってみましょう。

import java.io.OutpuStream;

 
public class StandardOutputStream extends OutputStream {
    private sysOut;
 
    public StandardOutputStream() {
        sysOut = System.out;
    }
 
    public void write(int b) throws IOException {
        sysOut.write(b);
    }
 
    public void write(byte b[]) throws IOException {
        sysOut.write(b);
    }
 
    public void write(byte b[], int off, int len) throws IOException {
        sysOut.write(b, off, len);
    }
  
    public void flush() {
        sysOut.flush();
    } 
}

これだけです。OutputStream の close メソッドは何もしないメソッドなので、ちょうどいいです。後はこのクラスを使うようにすればいいだけです。

    PrintWriter writer = new PrintWriter(new OutputStreamWriter(new StandardOutputStream()));

これで、writer をクローズしても大丈夫。

でも、一番問題なのは、System.in/out/err をプログラムのいろいろなところで行っているような設計でしょうね。

Project Looking Glass 翻訳プロジェクト

LG3D の翻訳プロジェクトの Web ページ ができました。風間さんに英語のドキュメントを書いていただいて、シンプルだけどかっこいいページになっています。ファイルスタイルガイドまで英訳していただきました。

今、日本語以外にも翻訳プロジェクトが走りはじめているのですが、これらのプロジェクトの手本になるようにがんばらなくては。

0 件のコメント: