Date July 16, 2013
Tags java / snippet
Share このエントリーをはてなブックマークに追加

メンバーからBufferedReaderが例外を投げると聞かれたので、調べてみました。

サンプルコードはこんな感じ。これも例外処理とか投げっぱなしですが、 そこはまあ適当に。

public static void main(String[] args) throws Exception{
    {
        Reader r = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(r);
        String s = br.readLine();
        System.out.println(s);
        br.close();
    }
    {
        Reader r = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(r);
        String s = br.readLine();
        System.out.println(s);
        br.close();
    }
}

同じブロックが並んでますが、2つ目のブロックのreadLine()でStream closedというIOExcepitonが出ます。 なぜかというと、1つ目のブロックの最後で、br.close()する際に、System.inもクローズしてしまうからです。

System.inというのはSystemクラス内にpublic staticで定義されています。 なので1度クローズすると他の場所で使おうとしても閉じられたままです。 もっと言えば再オープンもできません。のでSystem.inやout、errはクローズしてはいけません。

とのことでした。

対処法としてはSystem.inはクローズしなくてもいい。ということですが、 それでもReaderやWriterを使った後に閉じないと気持ち悪いという人もいると思います。 そんなときは、InputStreamReaderを継承して、close()だけを何もしないように オーバーライドした、UnclosableInputStreamを作ってみてはいかがでしょうか。 サンプルコードはこちらなどにあります。

あるいはApache Commons IOのCloseShieldInputStreamという手もあるそうです。


Comments

comments powered by Disqus