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
。
编辑:我想确保StreamDecoder
closures工作也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。
无论如何,它是有道理的,它被强制执行。