FileInputStream fstream = new FileInputStream(someFile.getPath());
DataInputStream in = new DataInputStream(fstream);
電話in.close()
したら閉まりfstream
ますか?私のコードは次のようにGC例外を与えています:
java.lang.OutOfMemoryError: GC オーバーヘッドの制限を超えました
FileInputStream fstream = new FileInputStream(someFile.getPath());
DataInputStream in = new DataInputStream(fstream);
電話in.close()
したら閉まりfstream
ますか?私のコードは次のようにGC例外を与えています:
java.lang.OutOfMemoryError: GC オーバーヘッドの制限を超えました
はい、DataInputStream.close()
閉じますFileInputStream
。
これは、メソッドの次の実装を持つDataInputStream
inheritsによるものです。FilterInputStream
close()
public void close() throws IOException {
in.close();
}
Yourは、次のように記載されているドキュメントからそのメソッドをDataOutputStream
継承します。close()
FilterOutputStream
この出力ストリームを閉じ、ストリームに関連付けられているシステム リソースをすべて解放します。
の close メソッドは
FilterOutputStream
、そのフラッシュ メソッド を呼び出してから、基になる出力ストリームの close メソッドを呼び出します。
同じことがすべての実装に当てはまるはずですWriter
(ただし、ドキュメントには記載されていません)。
Java で Streams を操作するときにメモリの問題が発生しないようにするには、次のパターンを使用します。
// Just declare the reader/streams, don't open or initialize them!
BufferedReader in = null;
try {
// Now, initialize them:
in = new BufferedReader(new InputStreamReader(in));
//
// ... Do your work
} finally {
// Close the Streams here!
if (in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
これは、すべての Stream/Writer/Reader クラスによって実装されるAutoCloseable
-interfaceを導入するため、Java7 ではそれほど面倒ではないように見えます。チュートリアルを参照してください。