Java - ByteArrayOutputStream是否安全,没有flush()和close()?

问题描述 投票:7回答:3

那么,如果没有正确刷新和关闭,ByteArrayOutputStream会导致内存溢出吗?我的意思是他们是否有必要将代码放入或Java将垃圾收集它?

java
3个回答
8
投票

不,它会在最后一次引用丢失后收集垃圾。

根据javadoc

关闭ByteArrayOutputStream无效。在关闭流之后可以调用此类中的方法,而不会生成IOException。

另外,如果你看一下代码,flushclose都是ByteArrayOutputStream类中的无操作(尽管flush是继承自OutputStream,但它在OutputStream中是无操作的,除非在具体实现中被覆盖)。


5
投票

是。没有flush()close() ByteArrayOutputStream是安全的。无论你有没有,它对内存使用没有任何影响。

close()flush()ByteArrayOuputStream有关的唯一情况是,如果您在包含缓冲组件的输出管道的末尾使用它;例如一个BufferedWriter。然后你需要从管道的“顶部”刷新或关闭......以确保所有数据都进入字节数组。

调用flush()close()没有GC影响。无论哪种方式,只要对象保持可访问,流的内容将继续保留在内存中。 (相比之下,需要及时关闭对外部资源的读/写流,因为它们有一个需要释放的外部“资源描述符”...)

综上所述:

  • 它对flush)close()没有任何伤害,只有一个ByteArrayOutputStream。这是不必要的。
  • 通常需要关闭以ByteArrayOutputStream结尾的输出管道,但这不是因为内存使用或GC考虑因素。
  • 只要可以访问ByteArrayOutputStream对象,就会使用(至少)内存。

1
投票

如果你看一下ByteArrayOutputStream的来源,你可以看到closeflush方法是一个noop,这意味着它们什么都不做。但是,我仍然建议调用这些,因为尽管在Javadoc中明确声明了close方法行为,但实现可能会发生变化。

其次,垃圾收集与这些方法中的任何一个都无关。有几种不同的实现(引用计数为1),但通常在没有对对象实例的引用时,它将被垃圾回收。

© www.soinside.com 2019 - 2024. All rights reserved.