Properties#load(InputStream)で悩む。

Propertiesでファイルから値を読み込む際、こーやってた。


Properties prop = ・・・;
File file = ・・・;
prop.load(new FileInputStream(file));
例外は上位にスローする場合、1行で簡単に実装できたりする。


でも、よーく見ると、Propertiesに渡しているInputStreamがcloseされていない。
Properties#loadの実装でも、InputStreamをcloseする処理はない。


んじゃー自分できちんとcloseすべきかというと、FileInputStreamは
finalizeでcloseする処理が実装されているので、ファイルをたくさん開く処理とか
ストリームを参照し続けるようなことがないならば、問題ないとも考えられる。




逆に、きちんと書くとすると・・・


Properties prop = ・・・;
File file = ・・・;

FileInputStream fis = null;
try {
fis = new FileInputStream(file);
prop.load(fis);
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
}
}
}

すげーわかりにくい。
うーん。
でも、やっぱりちゃんとcloseすべきなんだろーなぁ。


あと、これと関連した問題でClass#getResourceAsStreamで取得したInputStreamは
きちんとcloseすべきなんだろーかとかいうのも疑問だったりする。



ついでに、リソースのcloseは、Jakarta Commons IOのIOUtils#closeQuietlyを使うと
ちょっとすっきりする。
まーこの程度のメソッドなら、自分で作ってもいいんだけどさ。