Java – ByteArrayOutputStream是否安全,没有flush()和close()?
那么,如果没有正确刷新和关闭,ByteArrayOutputStream会导致内存溢出吗? 我的意思是他们有必要将代码放入或Java将垃圾收集吗?
不,它会在最后一次引用丢失后收集垃圾。
根据javadoc :
关闭ByteArrayOutputStream无效。 在关闭流之后可以调用此类中的方法,而不会生成IOException。
此外,如果查看代码,则flush
和close
都是ByteArrayOutputStream
类中的无操作(尽管flush
是从OutputStream
inheritance的,但它在OutputStream
是无操作,除非在特定实现中被覆盖)。
是。 不刷新或不关闭ByteArrayOutputStream
是安全的。 它对内存使用没有影响。
close()
或flush()
执行与ByteArrayOuputStream
任何事情的唯一情况是,如果您在包含缓冲组件的输出管道的末尾使用它; 例如BufferedWriter
。 然后你需要从管道的“顶部”刷新或关闭……以确保所有数据都进入字节数组。
调用flush()
或close()
没有GC含义。 无论哪种方式,只要对象保持可访问,流的内容将继续保留在内存中。 (相比之下,需要及时关闭对外部资源的读/写流,因为它们具有需要释放的外部“资源描述符”…)
综上所述:
- 关闭裸
ByteArrayOutputStream
没有坏处。 这是不必要的。 - 通常需要关闭以
ByteArrayOutputStream
结尾的输出管道,但这不是因为内存使用或GC考虑因素。
如果查看ByteArrayOutputStream的源代码,可以看到close
和flush
方法是noop,这意味着它们什么都不做。 但是,我仍然建议调用它们,因为尽管在Javadoc中明确声明了close
方法行为,但实现可能会发生变化。
其次,垃圾收集与这些方法中的任何一个都无关。 有几种不同的实现(引用计数为1),但通常在没有对对象实例的引用时,它将被垃圾收集。