2009-12-01 7 views
48

可能性の重複:
Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?サーブレットの出力ストリームを閉じるべきですか?

は私がHttpServletResponse.getOutputStream()を閉鎖する責任(またはgetWriterのを()あるいは入力ストリーム) AMまたは私はそれを残す必要がありますコンテナ?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    OutputStream o = response.getOutputStream(); 
    ... 
    o.close(); //yes/no ? 
} 

答えて

59

本当にそうする必要はありません。

サムルール:new SomeOutputStream()を使用して自分自身を作成/開いていない場合は、自分で閉じる必要はありません。たとえば、new FileOutputStream("c:/foo.txt")の場合は、明らかにあなた自身で閉じる必要があります。

まだ一部の人々がそれをしている理由はになります。は何も返信されません。これが発生すると、アプリケーションサーバーのログにIllegalStateExceptionが表示されますが、これはクライアントには影響しないため、クライアントは依然として適切な応答を得ます。これは、一見すると見えないリクエスト - レスポンスチェーンの潜在的な問題を発見するための簡単なデバッグです。例えば、何か他のものがチェーンのさらに下流のレスポンスボディにデータを追加しています。

先頭に表示されているもう1つの理由は、が返信したくないということです。より多くのデータが応答本文に書き込まれることを防ぎます。これは、JSPが応答で誤って役割を果たすときによく見られます。ログ内のIllegalStateExceptionは無視されます。言うまでもなく、この特定の目的はが悪いです。

+1

コンテナには、コミットされていないバイトを含む可能性のあるラッピングストリームの可視性がないため、別のInputStreamをラップするために開いた場合は、ストリームを閉じることができます。 BufferedOutputStreamのようなものであればラッピングストリームをflush()するのが理想ですが、CipherOutputStreamを使用してこのクラスがデータを完全に書き込んでいないことがわかりました(この場合は正当な理由があると思います)。 この状況では、クライアントが正しい応答を得るためにclose()を呼び出す必要がありました。 –

8

いいえ、あなたはそれを閉じる必要はありません。基本的には、クライアントへの応答を終了します。ストリームを閉じた後、次の要求までクライアントに何も送ることはできません。あなたはストリームを開かなかったので、ストリームを閉じる必要はありません。

+14

右。農場のように:あなたが見つけたのと同じようにゲートをそのままにしておいてください。 – erickson

関連する問題