作者:爱吹泡泡de鱼_436 | 来源:互联网 | 2023-01-31 16:59
JavaDoc for InputStreamReader
没有透露有关关闭基础的信息InputStream
:
https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html#close--
从类复制的描述:读者
关闭流并释放与其关联的所有系统资源。一旦关闭流,进一步的read(),ready(),mark(),reset()或skip()调用将引发IOException。关闭先前关闭的流无效。
关闭InputStreamReader还会关闭基础InputStream吗?
更新于:
InputStreamReader istream = new InputStreamReader(conn.getInputStream(), "UTF-8")
istream.close();
我需要关闭conn.getInputStream()
吗?
InputStreamReader
实现直接close
调用的StreamDecoder
是本机类。这就是为什么我问一个问题(向您低调!)。
1> Klitos Kyria..:
正如其他答案和评论所说,答案是肯定的,它确实关闭了InputStream。您可以使用以下代码亲自查看:
InputStream is = new FileInputStream("D:\\a.txt");
Reader r = new InputStreamReader(is);
r.close();
is.read(); // throws exception: stream is closed.
因此,如果关闭阅读器,则无需同时关闭InputStream。但是,我想您到处都在使用try-with-resources(不是吗?;)),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.