2017-09-25 34 views
1

我已阅读下列主题: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?我应该通过response.getOutputStream()显式关闭ZipOutputStream吗?

但如果我用以下结构:

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

我应该将其关闭或容器将做到这一点,而不是我?

+0

用于'ZipOutputStream.close的JavaDoc()'表示“关闭ZIP输出流以及被过滤的流”。 。 – Berger

+0

@Berger,是的,它关闭。但是,容器将只关闭response.getOutputStream()ANS不会关闭ZipOutputStream – gstackoverflow

回答

1

一般来说闭最外层流将所述close()传播到股内液流,关闭所有所需的资源。

这当然是完全有可能建立一个行为不当流,但ZipOutputStream可能是一个也没有。

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

+0

哪个流是最在我的情况? – gstackoverflow

+0

@gstackoverflow:包装另一个流的流,即'ZipOutputStream'是要关闭的流。 – Berger

+0

@Berger,因此我应该明确关闭ZipOutputStream吗? – gstackoverflow

0

是的,您应该在ZipOutputStream上明确指定close()方法,here's代码为close()方法。它具有以下功能:超类的

  • 呼叫close(),这是DeflaterOutputStream在我们的例子
  • DeflaterOutputStream电话finish()close()上基本OutputStream调用close()之前。

finish()方法,所以你最终可能会与一些不成文的数据,如果你不ZipOutputStreamclose()明确写入剩余压缩数据。所以,我会建议调用它。

相关问题