我应该通过 response.getOutputStream() 显式关闭 ZipOutputStream 吗?

Should I explicitly close ZipOutputStream over response.getOutputStream()?

我已阅读以下主题:

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

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

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

一般来说,关闭最外层的流会将 close() 传播到内部流,从而关闭所有必需的资源。

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

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

是的,您应该在 ZipOutputStream 上显式调用 close() 方法,here's close() 方法的代码。它执行以下操作:

  • 调用超级 class 的 close(),在我们的例子中是 DeflaterOutputStream
  • DeflaterOutputStream 中的
  • close() 在调用基础 OutputStream 上的 close() 之前调用 finish()

finish() 方法会写入剩余的压缩数据,因此,如果您没有明确地在 ZipOutputStream 上调用 close(),您可能会得到一些未写入的数据。所以,我建议调用它。