web-dev-qa-db-ja.com

サーブレット出力ストリームを閉じる必要がありますか?

可能性のある複製:
HttpServletResponse.getOutputStream()/。getWriter()?で.close()を1回呼び出す必要があります

HttpServletResponse.getOutputStream()(またはgetWriter()またはinputstream)を閉じる必要がありますか、それともコンテナに残すべきですか?

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

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

経験則:new SomeOutputStream()を使用して自分で作成/オープンしなかった場合、自分で閉じる必要はありません。たとえばnew FileOutputStream("c:/foo.txt")の場合、明らかに自分で閉じる必要があります。

一部の人々がまだそれをしている理由は、単に保証が応答本文にこれ以上書き込まれないことです。これが発生した場合、これによりappserverログにIllegalStateExceptionが発生しますが、これはクライアントに影響を与えないため、クライアントは適切な応答を受け取ります。これは、一見すると見えないリクエスト/レスポンスチェーンの潜在的な問題を見つけるための簡単なデバッグでもあります。たとえば、別の何かが、チェーンのさらに下のどこかで、より多くのデータを応答本文に追加しています。

スターターに見られるもう1つの理由は、応答ボディにさらにデータが書き込まれることをpreventにしたかっただけです。これは、JSPが応答で誤って役割を果たしている場合によく見られます。ログ内のIllegalStateExceptionsを無視します。言うまでもなく、この特定の目的はbadです。

66
BalusC

いいえ、閉じる必要はありません。行う場合、基本的にクライアントへの応答を終了します。ストリームを閉じた後は、次のリクエストまでクライアントに何かを送信することはできません。ストリームを開いていないため、閉じる必要はありません。

8
Jeremy Raymond