当前位置: 首页 > 知识库问答 >
问题:

关闭InputStreamReader是否也会关闭基础InputStream?

左丘峰
2023-03-14

JavaDoc forInputStreamReader没有提到关闭底层InputStream

https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html#close--

从课堂上复制的描述:Reader

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

关闭InputStreamReader是否也会关闭基础InputStream?

更新内容:

InputStreamReader istream = new InputStreamReader(conn.getInputStream(), "UTF-8")
istream.close();

是否需要关闭连接getInputStream()?

InputStreamReaderimplementation directclose调用本机类的StreamDecoder

共有2个答案

周博达
2023-03-14

这取决于流实现InputStream只是close()中的一个“接口”InputStreamReader不会关闭界面。如果是,它将关闭底层数据资源(如文件描述符)。如果close在实现中被覆盖且为空,则它将不起任何作用。

在OpenJdk中,StreamDecoder有一个方法

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

这个。在中是来自解码器构造函数的输入流:

StreamDecoder(InputStream var1, Object var2, CharsetDecoder var3) {
    ...
    if(this.ch == null) {
        this.in = var1;
        ...
    }
    ...
}

以下是关闭操作的示例<代码>字节数组输入流:

关闭ByteArrayInputStream没有效果。此类中的方法可以在流关闭后调用,而不会生成IOException。

public void close() throws IOException {
}

FileInputStream不同:

关闭此文件输入流并释放与该流关联的所有系统资源。如果该流具有关联的通道,则该通道也将关闭。关闭基础实例后,无论哪个接口在使用它,它都会被关闭。

public void close() throws IOException {
    synchronized (closeLock) {
        if (closed) {
            return;
        }
        closed = true;
    }
    if (channel != null) {
       channel.close();
    }

    fd.closeAll(new Closeable() {
        public void close() throws IOException {
           close0();
       }
    });
}
游安康
2023-03-14

正如其他答案和评论所说,答案是肯定的,它确实关闭了输入流。您可以使用以下代码自己查看:

    InputStream is = new FileInputStream("D:\\a.txt");
    Reader r = new InputStreamReader(is);
    r.close();
    is.read();  // throws exception: stream is closed.

因此,如果关闭了Reader,则不需要同时关闭InputStream。然而,我猜你到处都在使用尝试资源(不是吗?;)),InputStream和Reader都将在try块结束时关闭。这并不重要,因为InputStream可以被多次关闭;如果流已经关闭,则没有操作。

如果希望避免关闭InputStream,可以编写一个简单的包装器,在关闭时不做任何操作:

    class UncloseableInputStream extends FilterInputStream {
        public UncloseableInputStream(InputStream is) {
            super(is);
        }
        public void close() {
            // Do nothing.
        }
    }

    InputStream is = new FileInputStream("D:\\a.txt");
    Reader r = new InputStreamReader(new UncloseableInputStream(is));
    r.close();
    is.read();  // still works despite closing the reader.
 类似资料:
  • 的JavaDoc没有说明关闭底层: https://docs.oracle.com/javase/8/docs/api/java/io/inputstreamreader.html#close-- 从类复制的描述:Reader 关闭流并释放与之关联的任何系统资源。一旦流关闭,进一步的read()、ready()、mark()、reset()或skip()调用将引发IOException。关闭以前关

  • 问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家

  • 我读过很多帖子,人们说在java、语句等中关闭连接,但我没有找到我的问题的答案。 我问我不做Con.close(),但我做所以它会关闭连接或不? 所以我只想知道,当我们关闭结果集时,连接是否会关闭?

  • 问题内容: 在这里提供一些答案并阅读了一些评论之后,看来,实际上IOException永远不会对文件I / O抛出异常。 在任何情况下,在Stream / Reader / Writer上进行close调用实际上会引发IOException吗? 如果实际引发异常,应该如何处理? 问题答案: 对于文件,可能不会在close()上经常抛出IOException,但是对于非文件I / O,您肯定会看到它

  • 问题内容: 我知道Java中的安全模式是在finally块中依次关闭ResultSet,Statement和Connection。 如果您关闭连接,然后尝试关闭语句(不抛出异常)。但是,如果您尝试从语句中调用任何方法,则会引发异常。 我想知道关闭连接是否会自动关闭从该连接创建的所有语句对象? 更新: 我正在使用DatabaseProductVersion:Oracle Database 11g版本

  • 问题内容: 我想知道,在关闭阅读器之后,是否需要关闭InputStream? 问题答案: 不,您不必。 由于Java中用于流的装饰器方法可以通过将新流或读取器附加到其他流上来构建新流或读取器,因此实现将自动对其进行处理。 如果查看其来源,则会看到: 因此,关闭操作实际上关闭了底层的流读取器。 编辑:我想确保关闭也可以在输入流上工作,请继续关注。 签入 在调用sd的close时调用。