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
继承FilterInputStream
了该close()
方法的以下实现:
public void close() throws IOException {
in.close();
}
您从其文档DataOutputStream
中继承了它的close()
方法:FilterOutputStream
关闭此输出流并释放与该流关联的所有系统资源。
的close方法
FilterOutputStream
调用其flush方法, 然后调用其底层输出流的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();
}
}
}
这在 Java7 中看起来不那么混乱,因为它引入了 -interface AutoCloseable
,它由所有 Stream/Writer/Reader 类实现。请参阅教程。