closures阅读器后,是否需要closuresInputStream?

我想知道,closures读取器之后,是否需要closuresInputStream?

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; } } 

不,你不需要。

由于用于Java中的stream的装饰器方法可以通过将它们附加到其他stream上来构build新的stream或读取器,所以这将自动由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(); } 

所以closures操作实际上closures了stream读取器下面的InputStream

编辑:我想确保StreamDecoderclosures工作也inputstream,敬请StreamDecoder

StreamDecoder.java检查过它

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

当sd的close被调用时被调用。

从技术上讲,closuresReader将closuresInputStream 。 但是,如果在打开InputStream和创buildReader之间出现故障,则仍应closuresInputStream 。 如果你closures了InputStream [资源],那么closuresReader [decorator]不应该是一个很好的理由。 还有一些stream行的错误,在closures装饰之前closures装饰可以抛出exception。 所以:

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

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

如果close()读者,则不必closuresstream。

closuresstream并释放与之关联的所有系统资源。 一旦stream被closures,read(),ready(),mark(),reset()或skip()调用将会抛出一个IOExceptionexception。 closures以前closures的stream不起作用。

不,你不会closures底层的InputStream

根据来源嗅探,读者closures其基础inputstream。 根据javadoc,当reader.close()被调用时,它关联InputStreamReader“closuresstream”。

我不确定当你使用reader.close()时,是否有任何Reader必须closures它的源代码。 我认为这很重要,所以你的代码可以使用一个阅读器,不pipe它是什么具体types。

无论如何,它是有道理的,它被强制执行。