代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

关闭阅读器后是否需要关闭inputstream?

  •  46
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    我想知道,在我关闭阅读器之后,是否需要关闭输入流?

        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 回复  |  直到 13 年前
        1
  •  42
  •   Luke Woodward    14 年前

    不,你不必。

    由于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 close也可以在输入流上工作,请继续调优。

    在里面检查 StreamDecoder.java

    void implClose() throws IOException {
      if (ch != null)
        ch.close();
      else
        in.close();
    }
    

    当调用sd's close时调用。

        2
  •  8
  •   Tom Hawtin - tackline    14 年前

    技术上,关闭 Reader 将关闭 InputStream . 但是,如果在打开 输入流 并创建 读者 ,您仍应关闭 输入流 . 如果你关闭 输入流 [资源]不应该有很好的理由关闭 读者 [装饰师]。还有一些流行的错误,关闭一个装饰器可以在关闭装饰之前抛出一个异常。所以:

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

    有一些复杂的问题需要注意。由于实现的原因,一些装饰器实际上可能包含本机资源。输出装饰器通常需要刷新,但仅在高兴的情况下(因此在 try 不是 finally 块)。

        3
  •  5
  •   palacsint    13 年前

    你不必关闭流,如果你 close() 读者。

    关闭流并释放与 它。流关闭后,进一步read()、ready()、mark(), reset()或skip()调用将引发IOException。关闭一个 以前关闭的流无效。

        4
  •  3
  •   Jon Freedman    14 年前

    不,你不知道,阅读器会关闭底层的inputstream

        5
  •  0
  •   helios    14 年前

    对源代码进行嗅探之后,读卡器将关闭其底层的输入流。根据JavaDoc的说法,当调用reader.close()时,inputStreamReader“关闭流”的接缝。

    我不确定在执行reader.close()操作时是否有任何阅读器必须关闭其源。我认为这很重要,所以您的代码可以使用阅读器,不管它是什么具体类型。

    不管怎样,强制执行是有道理的。