2016-05-01 1 views
3

は、以下のJavaコードを考慮:DataInputStream closeは、ガベージコレクションの際にInputSreamをラップしますか?

void test(InputStream inputStream) { 
    DataInputStream dataInputStream = new DataInputStream(inputStream); 
    return; 
} 

testメソッド戻り、DataInputStreamのは(いつか)ごみ収集されます。 DataInputStreamはファイナライザで内部ストリームを閉じますか?

明示的なステートメントが見つからない場合は、それを見つけることができませんでした。行動に関する公式の文書はありますか?あなたは1つがある場合はポイントしてくださいできますか?

ありがとうございました。

編集: DataInputStreamを閉じても内部ストリームも閉じられるかどうかは問いません。私は閉じていないと外側のストリームが生ゴミ収集されているインナーはまだそれを参照しているので、生きているかどうかを尋ねています。

+2

@tunaki OPは、GCファイナライザのためにストリームが明示的にクローズコールなしで閉じられるかどうかを尋ねました。そのようなファイナライザがないので、答えはノーです。 – wero

+0

@weroはい、それは私が尋ねるものです。 「そのようなファイナライザはありません」はどこかに書かれていますか?実装固有か必須かは仕様によって決まりますか?すべてのリンク?ありがとう。 – volkan

+3

@Volkanは、単に 'DataInputStream'のソースを見て、階層を処理します。ファイナライザはありません。ファイナライザを持つ 'java.io'の唯一のクラスは' FileInputStream'と 'FileOutputStream'です。その文書がどこにあるのかわからない。 – wero

答えて

1

DataInputStreamにファイナライザがないことを明示的に示しているドキュメントはありませんが、の書籍はではありません。 finalize()メソッドの目的は、壊れたプログラムを解放することを忘れたリソースを解放することであるため、リソースを持つクラスのみがそのような安全ネットを持つ可能性があります。しかし、DataInputStreamはリソースを保持していないので、そのようなfinalize()メソッドはありません。

これはリソースを保持する可能性があり、そのため基礎となるInputStreamに到達できなくなった場合にのみ、ガードクリーナーがリソースを解放する可能性があります。あなたがまだ強い参照を保持している間に、あなたのコントロールの外側のコードがあなたのInputStreamを偽って閉じるとき、それは確実に壊れた動作とみなすことができます。

関連する問題