关闭Reader后是否需要关闭InputStream?

时间:2010-09-02 15:59:19

标签: java

我想知道,关闭读卡器后,是否需要关闭InputStream?

    try {
        inputStream = new java.io.FileInputStream(file);
        reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
    }
    catch (Exception exp) {
        log.error(null, exp);
    }
    finally {
        if (false == close(reader)) {
            return null;
        }
        // Do I need to close inputStream as well?
        if (false == close(inputStream)) {
            return null;
        }
    }

5 个答案:

答案 0 :(得分:42)

不,你没必要。

由于用于Java中的流的装饰器方法可以通过将它们附加到其他流来构建新的流或读取器,因此InputStreamReader实现将自动处理它。

如果您查看其来源InputStreamReader.java,您会看到:

private final StreamDecoder sd;

public InputStreamReader(InputStream in) {
  ...
  sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
  ...
}

public void close() throws IOException {
  sd.close();
}

因此,关闭操作实际上会关闭流阅读器底层的InputStream

编辑:我想确保StreamDecoder关闭也适用于输入流,敬请关注。

StreamDecoder.java

中查看了它
void implClose() throws IOException {
  if (ch != null)
    ch.close();
  else
    in.close();
}

在调用sd的关闭时调用。

答案 1 :(得分:8)

从技术上讲,关闭Reader会关闭InputStream。但是,如果在打开InputStream和创建Reader之间出现故障,您仍应关闭InputStream。如果您关闭InputStream [资源],则不应该有理由关闭Reader [装饰器]。还有一些流行的错误,关闭装饰器可以在关闭装饰之前抛出异常。所以:

Resource resource = acquire();
try {
    Decorator decorated = decorate(resource);
    use(decorated);
} finally {
    resource.release();
}

需要注意一些并发症。由于实现,一些装饰器实际上可能包含本机资源。输出装饰器通常需要刷新,但仅在快乐的情况下(所以在try而不是finally块中)。

答案 2 :(得分:5)

如果您close()读者,则无需关闭流。

  

关闭流并释放与之关联的所有系统资源   它。流关闭后,进一步read(),ready(),mark(),   reset()或skip()调用将抛出IOException。关闭一个   以前关闭的流没有效果。

答案 3 :(得分:3)

不,你不会读者将关闭底层的InputStream

答案 4 :(得分:0)

根据源嗅探读者关闭其底层输入流。根据javadoc,它调用了当调用reader.close()时InputStreamReader“关闭流”。

我不确定当你执行reader.close()时,任何读者是否必须关闭其来源。我认为这很重要,因此无论具体类型如何,您的代码都可以使用读者。

无论如何,它是强制执行的。