2017-09-25 427 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()明確寫入剩餘壓縮數據。所以,我會建議調用它。