シナリオ内でのみ閉じる必要がありBufferedReader
ます。
他の人が指摘しているように、JavaDocsはあいまいです。close
すぐに呼び出されたい場合は、try-with-resourcesブロックを使用するのが最善の方法ですが、リーダーを開いたままにする必要がある場合は機能しません(たとえば、基礎となる読者-通常、そこに電話をかけるのは発信者の責任close
です)。
ソースコードにアクセスできず、リーダーとJVMがclose
状況に応じてさまざまなリーダーとストリームを呼び出すかどうかを確認したい場合はclose
、簡単なテストとしてメソッドをオーバーライドできます。
Path path = Paths.get("/home/example/test.txt");
InputStream fileInputStream = new FileInputStream(path.toFile()) {
public void close() throws IOException {
System.out.println("FileInputStream::close()");
super.close();
}
};
Reader inputStreamReader = new InputStreamReader(fileInputStream, Charsets.UTF_8) {
public void close() throws IOException {
System.out.println("InputStreamReader::close()");
super.close();
}
};
BufferedReader bufferedReader = new BufferedReader(inputStreamReader) {
public void close() throws IOException {
System.out.println("BufferedReader::close()");
super.close();
}
};
bufferedReader.close();
上記を実行すると、次のようなものが表示されます。
BufferedReader::close()
InputStreamReader::close()
FileInputStream::close()
JavaDocには明示的な仕様が記述されていないため、すべてのJVMでの動作を確認することはできません。ただし、ほとんどのリーダー/ストリームは上記のパターンに従っているようです(たとえばGZIPInputStream
、上記の例にを追加して、それGZIPInputStream::close()
が呼び出されることを確認できます)。