我应该通过 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()
,您可能会得到一些未写入的数据。所以,我建议调用它。
我已阅读以下主题:
但是如果我使用以下结构会怎样:
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
我应该关闭它还是容器会代替我来做?
一般来说,关闭最外层的流会将 close()
传播到内部流,从而关闭所有必需的资源。
当然完全有可能创建一个行为不佳的流,但 ZipOutputStream
可能不是这样。
在某些情况下,在最外层的流上调用 close()
可能不够,但是 class 的文档应该指出任何特殊行为。
是的,您应该在 ZipOutputStream
上显式调用 close()
方法,here's close()
方法的代码。它执行以下操作:
- 调用超级 class 的
close()
,在我们的例子中是DeflaterOutputStream
close()
在调用基础OutputStream
上的close()
之前调用finish()
。
DeflaterOutputStream
中的 此 finish()
方法会写入剩余的压缩数据,因此,如果您没有明确地在 ZipOutputStream
上调用 close()
,您可能会得到一些未写入的数据。所以,我建议调用它。