InputStreamReader
的JavaDoc没有说明关闭底层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();
InputStreamReader
实现直接Close
调用本机类StreamDecoder
。这就是为什么我问(向你这个退伍军人!)问题的原因。
正如其他答案和评论所说的,答案是肯定的,它确实关闭了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可以关闭多次;如果流已经关闭,则为no-op。
如果希望避免关闭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 for没有提到关闭底层的: https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html#close-- 从课堂上复制的描述:Reader 关闭流并释放与之关联的所有系统资源。流关闭后,进一步的read()、ready()、mark()、reset()或skip()调用将抛出IOException。
问题内容: 考虑下面的Python(2.x)代码: 我假设由于打开的文件仍然未被引用,因此必须自动关闭它。我已经阅读了有关Python中的垃圾收集器的信息,该垃圾收集器可释放未使用对象分配的内存。GC是否也足以处理文件? 问题答案: 取自文档(python 3.6): 如果未使用with关键字,则应调用f.close()关闭文件并立即释放文件使用的所有系统资源。如果您未明确关闭文件, Python
问题内容: 我想知道,在关闭阅读器之后,是否需要关闭InputStream? 问题答案: 不,您不必。 由于Java中用于流的装饰器方法可以通过将新流或读取器附加到其他流上来构建新流或读取器,因此实现将自动对其进行处理。 如果查看其来源,则会看到: 因此,关闭操作实际上关闭了底层的流读取器。 编辑:我想确保关闭也可以在输入流上工作,请继续关注。 签入 在调用sd的close时调用。
问题内容: 我已经看到了许多使用HttpURLConnection + InputStream并在使用后关闭(或不关闭它们)的示例。这就是我想出的方法,以确保完成后所有内容都关闭,无论是否存在错误。这有效吗? 谢谢 问题答案: 是的。在做最后的端部将是最好的主意,因为如果代码某处出现故障时,程序将无法达到,直到,报表,我们catch语句之前保持… 如果代码在某处失败并且在程序之间引发异常,则无论引
问题内容: 有关绩效考量的问题。在Java 1.7.0_06之前,该方法返回一个新对象,该对象与其父对象共享相同的基础char数组,但偏移量和长度不同。为了避免在只需要保留小的子字符串时在内存中保留非常大的字符串,程序员习惯于编写如下代码: 从1.7.0_06开始,不再需要创建新的字符串,因为在Oracle的实现中,子字符串不再共享其基础char数组。 我的问题是:我们可以依赖Oracle(和其他
考虑下面这段Python(2.x)代码: 我假设,由于打开的文件仍然未被引用,因此必须自动关闭。我读过Python中的垃圾收集器,它释放由未使用的对象分配的内存。GC是否也足够处理这些文件?