注:この質問とその回答のほとんどは、Java 7 のリリース前にさかのぼります。Java 7 は、これを簡単に行うための自動リソース管理機能を提供します。Java 7 以降を使用している場合は、Ross Johnson の回答に進む必要があります。
Javaでネストされたストリームを閉じるための最良かつ最も包括的な方法と考えられているものは何ですか? たとえば、次のセットアップを考えてみましょう。
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
閉じる操作を保証する必要があることを理解しています(おそらくfinally句を使用して)。私が疑問に思っているのは、ネストされたストリームが閉じられていることを明示的に確認する必要があるのか、それとも外側のストリーム (oos) を確実に閉じるだけで十分なのかということです。
少なくともこの特定の例を扱って気付いたことの 1 つは、内部ストリームが FileNotFoundExceptions のみをスローしているように見えることです。これは、失敗した場合にそれらを閉じることを技術的に心配する必要がないことを暗示しているようです。
同僚が書いたものは次のとおりです。
技術的には、正しく実装されていれば、最も外側のストリーム (oos) を閉じるだけで十分です。しかし、実装には欠陥があるようです。
例: BufferedOutputStream は、次のように定義されている FilterOutputStream から close() を継承します。
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
ただし、flush() が何らかの理由で実行時例外をスローした場合、out.close() は呼び出されません。そのため、ファイルを開いたままにしている FOS を閉じることを主に心配するのが "最も安全" (しかし見苦しい) ようです。
ネストされたストリームを閉じるための、絶対に確認する必要がある場合の最善のアプローチと考えられるものは何ですか?
そして、これを詳細に扱っている公式の Java/Sun ドキュメントはありますか?