Java 我是否应该在response.getOutputStream()上显式关闭ZipOutputStream?

Java 我是否应该在response.getOutputStream()上显式关闭ZipOutputStream?,java,servlets,memory-leaks,io,resource-management,Java,Servlets,Memory Leaks,Io,Resource Management,我读过以下主题: 但如果我使用以下结构会怎么样: ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); 我应该关闭它还是容器代替我来做?一般来说,关闭最外面的流会将close()传播到内部流,关闭所有需要的资源 当然,完全有可能创建一个行为不好的流,但是ZipOutputStream可能不是 在某些情况下,在最外层的流上调用close()可能不够,但是类的文档应该指出任何特殊行为。是的,您应该在Z

我读过以下主题:

但如果我使用以下结构会怎么样:

    ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

我应该关闭它还是容器代替我来做?

一般来说,关闭最外面的流会将
close()
传播到内部流,关闭所有需要的资源

当然,完全有可能创建一个行为不好的流,但是
ZipOutputStream
可能不是


在某些情况下,在最外层的流上调用
close()
可能不够,但是类的文档应该指出任何特殊行为。

是的,您应该在
ZipOutputStream
上显式调用
close()
方法,即
close()
方法的代码。它做了以下工作:

  • 调用超类的
    close()
    ,在我们的例子中是
    DeflaterOutputStream
  • DeflaterOutputStream的
    close()
    调用
    finish()
    ,然后在基础
    OutputStream上调用
    close()

finish()
方法写入剩余的压缩数据,因此如果不显式调用
ZipOutputStream
上的
close()
,可能会得到一些未写入的数据。因此,我建议调用它。

ZipoutStream.close()的javadoc说“关闭ZIP输出流以及正在过滤的流”。@Berger,是的,它关闭了。但是容器将只关闭响应。getOutputStream()ans不会关闭ZipOutputStream在我的情况下哪个流是最外层的?@gstackoverflow:包装另一个流的流,即
ZipOutputStream
是要在此处关闭的流。@Berger,因此我应该显式关闭ZipoutStream吗?@gstackoverflow当然。您应该始终显式关闭资源。@是的,是吗?您需要关闭
ZipOutputStream
,作为一种副作用,响应流也将关闭,但无论如何,您不会在压缩字节后添加任何数据。