10
FileInputStream fstream = new FileInputStream(someFile.getPath());
DataInputStream in = new DataInputStream(fstream);

如果我打电话in.close(),它也会关闭fstream吗?我的代码给出了 GC 异常,如下所示:

java.lang.OutOfMemoryError:超出 GC 开销限制

4

2 回答 2

9

是的,DataInputStream.close()也会关闭你的FileInputStream.

这是因为DataInputStream继承FilterInputStream了该close()方法的以下实现:

    public void close() throws IOException {
        in.close();
    }
于 2012-12-26T12:13:36.693 回答
6

您从其文档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 类实现。请参阅教程

于 2012-12-26T12:25:34.337 回答