AFAIK,对流上的close
(I / O)的调用将关闭包括其自身在内的所有基础流。
反之亦然?
例如:
InputStream inStream = new FileInputStream("abc.txt");
BufferedInputStream bin = new BufferedInputStream(inStream);
inStream.close();
这也会关闭bin
吗?
如果没有,是否有必要这样做?即:会导致内存泄漏吗?
答案 0 :(得分:2)
这会关闭
bin
吗?
封闭的流无法关闭封闭流,因为它不知道它。
如果没有,是否有必要这样做?即:它会导致内存泄漏吗?
它不会导致内存泄漏,因为资源由封闭的流分配/保存,并在关闭时正确释放,但封闭的流可能实现缓冲和其他转换逻辑,如果不刷新或关闭,数据实际写入封闭的流可能不完整/损坏。
所以总是建议冲洗封闭的流(首选是关闭它,但如果不能,那么你应该做的最小值就是冲洗它)。
刷新封闭流并不总是足够的,因为对于底层流包含有效数据,封闭流可能会添加额外的填充或格式。一个例子是ZipOutputStream
,为了提供有效的zip文件(zip格式),它提供了ZipOutputStream.finish()
方法,除了刷新之外还会写入额外的zip文件相关数据(并且不会关闭潜在的流)。
您可能会觉得这很有用:
答案 1 :(得分:1)
这会关闭垃圾箱吗?
没有。 (包裹的InputStream
没有对BufferedInputStream
的引用。它无法关闭它,即使它“想要”。)
如果没有,是否有必要这样做?
不是真的。 (但是,最好关闭包装器流而不是包装流...因为“输出”情况;请参阅下文。)
ie:会导致内存泄漏吗?
当然,没有。而不是资源泄漏:
从上面看,BufferedInputStream
无法访问InputStream
,因此对后者的操作不会影响前者的可达性。
BufferedInputStream
不“拥有”任何外部资源(例如文件描述符)。它们由InputStream
。
BufferedOuputStream
包裹OutputStream
的答案会有所不同。如果您直接关闭了包裹的OutputStream
,则可能会丢失尚未刷新的缓冲区中的数据。