2017-09-25 9 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はおそらく1ではありません。

場合によっては、最も外側のストリームでclose()を呼び出すだけでは不十分かもしれませんが、クラスのドキュメントには特別な動作が示されている必要があります。

+0

私の場合、どのストリームが最も外側にありますか? – gstackoverflow

+0

@gstackoverflow:別のストリームをラップするストリーム、つまり「ZipOutputStream」はここで閉じます。 – Berger

+0

@Bergerので、ZipOutputStreamを明示的に閉じるべきですか?もちろん – gstackoverflow

0

はい、ZipOutputStreamclose()メソッドを明示的に、here'sのコードをclose()の方法で呼び出す必要があります。 OutputStreamを根底にclose()を呼び出す前に、当社の場合DeflaterOutputStream通話finish()

  • close()DeflaterOutputStreamあるスーパークラスの

    • コールclose()、:それは次のことを行います。あなたが明示的ZipOutputStreamclose()を呼び出さない場合は、いくつか書き込まれていないデータで終わるかもしれないので、

    このfinish()方法は、残りの圧縮データを書き込みます。だから、私はそれを呼び出すことをお勧めします。

  • 関連する問題