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