【问题标题】:Should I explicitly close ZipOutputStream over response.getOutputStream()?我应该通过 response.getOutputStream() 明确关闭 ZipOutputStream 吗?
【发布时间】:2018-03-06 03:39:55
【问题描述】:

我已阅读以下主题: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?

但是,如果我使用以下构造:

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

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

【问题讨论】:

  • ZipOutputStream.close() 的 javadoc 说“关闭 ZIP 输出流以及被过滤的流”。 .
  • @Berger,是的,它关闭了。但是容器只会关闭 response.getOutputStream() 并且不会关闭 ZipOutputStream

标签: java servlets memory-leaks io resource-management


【解决方案1】:

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

  • 调用超类的close(),在我们的例子中是DeflaterOutputStream
  • close() of DeflaterOutputStream 在调用 close() 之前调用 finish() 在底层 OutputStream 上。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 在我的情况下哪个流最外层?
    • @gstackoverflow :包装另一个流的流,即 ZipOutputStream 是要在此处关闭的流。
    • @Berger,因此我应该明确关闭 ZipOutputStream 吗?
    • @gstackoverflow 当然。您应该始终明确关闭资源。
    • @gstackoverflow 是的,是吗?您需要关闭ZipOutputStream,作为副作用,响应流也将关闭,但无论如何您都不会在压缩字节后添加任何数据。
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2013-08-05
    • 2011-09-01
    • 2023-01-06
    • 1970-01-01
    相关资源
    最近更新 更多