メンバーから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