stream.close是否关闭任何封闭的流

时间:2014-09-05 11:09:54

标签: java stream

AFAIK,对流上的close(I / O)的调用将关闭包括其自身在内的所有基础流。
反之亦然

例如:

InputStream inStream = new FileInputStream("abc.txt"); 
BufferedInputStream bin = new BufferedInputStream(inStream);
inStream.close();  

这也会关闭bin吗? 如果没有,是否有必要这样做?即:会导致内存泄漏吗?

2 个答案:

答案 0 :(得分:2)

  

这会关闭bin吗?

封闭的流无法关闭封闭流,因为它不知道它。

  

如果没有,是否有必要这样做?即:它会导致内存泄漏吗?

它不会导致内存泄漏,因为资源由封闭的流分配/保存,并在关闭时正确释放,但封闭的流可能实现缓冲和其他转换逻辑,如果不刷新或关闭,数据实际写入封闭的流可能不完整/损坏。

所以总是建议冲洗封闭的流(首选是关闭它,但如果不能,那么你应该做的最小值就是冲洗它)。

刷新封闭流并不总是足够的,因为对于底层流包含有效数据,封闭流可能会添加额外的填充或格式。一个例子是ZipOutputStream,为了提供有效的zip文件(zip格式),它提供了ZipOutputStream.finish()方法,除了刷新之外还会写入额外的zip文件相关数据(并且不会关闭潜在的流)。

您可能会觉得这很有用:

Close Encapsulating Writers/Streams for ServletOutputStream

答案 1 :(得分:1)

  

这会关闭垃圾箱吗?

没有。 (包裹的InputStream没有对BufferedInputStream的引用。它无法关闭它,即使它“想要”。)

  

如果没有,是否有必要这样做?

不是真的。 (但是,最好关闭包装器流而不是包装流...因为“输出”情况;请参阅下文。)

  

ie:会导致内存泄漏吗?

当然,没有。而不是资源泄漏:

  • 从上面看,BufferedInputStream无法访问InputStream,因此对后者的操作不会影响前者的可达性。

  • BufferedInputStream不“拥有”任何外部资源(例如文件描述符)。它们由InputStream

  • 拥有和管理

BufferedOuputStream包裹OutputStream的答案会有所不同。如果您直接关闭了包裹的OutputStream,则可能会丢失尚未刷新的缓冲区中的数据。