ストリームの構築とclose()
コール間の操作が例外をスローした場合終値は、発生しませんよう
BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
// you likely insert actual operations on br here
br.close();
のようなコードを使用して、強くお勧めしますことを強調しなければなりません。
あなたは「資源としてみてください」ではなく構築使用する必要があります。
は
try(BufferedInputStream br = new BufferedInputStream(new FileInputStream(file))) {
// your actual operations on br here
}
これはclose()
は例外がtry
体内で発生した場合でも呼び出されることを保証します。しかし、このコードはBufferedInputStream
のclose()
メソッドがFileInputStream
のclose()
メソッドを呼び出すという既知の事実に依存しますが、BufferedInputStream
の構築が完了するまでは発生しません。 BufferedInputStream
のコンストラクタが例外をスローすると、close()
を呼び出すオブジェクトがないので、close()
メソッドは呼び出されません。
本当に安全ソリューションは、BufferedInputStream
のコンストラクタが例外をスローした場合でもFileInputStream
を閉じ
try(FileInputStream fis = new FileInputStream(file);
BufferedInputStream br = new BufferedInputStream(fis)) {
// your actual operations on br here
}
です。このコンストラクタで間違っている可能性があるのは、OutOfMemoryError
を投げる可能性のあるバッファ割り当てであり、その場合は深刻な問題になります。
しかしObjectInputStream
のコンストラクタは、すでにヘッダを読み込むので
try(FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis)) {
// your actual operations on ois here
}
のような例を考えて、IOException
Sは、例外を引き起こすことになる、また、ヘッダーは無効である可能性があります、スローされる可能性があります。したがって、間違っていて、そのような場合でも基礎となるFileInputStream
が正しく閉じられていることを保証するためには、さらに多くのことが重要です。
「GB」とはどういう意味ですか? – biziclop
リソースの解放を行うためにガベージコレクタに頼るべきではありません。あなたの質問に対する正解は「_itかもしれない、そうでないかもしれない」です。 –
@MProkhorovのコメントについては、ガベージコレクタがその作業を行うときには保証されません。原則として無期限に仕事を延期することができます。つまり、リソースは無期限に割り当てられます。 GCに頼るのではなく、リソースを明示的に閉じます。 – Jesper