BufferedWriter の close はその接続先も close すべきか
件名は BufferedWriter となっているけれども、FilterWriter/Reader/InputStream/OutputStream 全てに当てはまる内容だし、Java 以外の言語にも当てはまる。
で、BufferedWriter の close はその親
の close もすべきかというと、もちろん俺の答えは yes だ。
unibon 氏は例外が出たときに親が完全に close されないことを気にしているようだが、それはいくら気にしても解決できる問題ではない。そもそも unibon 氏は BufferedWriter の close の中で親の flush が呼ばれたときに例外が出ることしか心配していないように見受けられるが、実際にはその後に親の close が呼ばれたときに例外が発生する可能性だってある。親を閉じようとしたら例外が出て閉じられなかったということになったら、もう対処のしようがない。だから、100% 確実にストリームを閉じる方法はない、という事実をまず認識しなくてはいけない。
それに、もし BufferedWriter の close が親の Writer を close しないということになっていたとしたら、次のようなコードは書けなくなる。
void readData() throws IOException {
Writer w = getWriter();
w.write(xxx);
w.close();
}
protected abstract Writer getWriter() throws IOException;
上のコードで、もし getWriter が BufferedWriter を返したとしたら、readData メソッドはどうやってその親を閉じればいいのか。readData の中の w.close(); で親も close されること期待するしかない。だから、BufferedWriter の close は親も close してくれないと困るのだ。
| 固定リンク

コメント