2009-09-15 12 views
11

私はresponse.getOutputStream()を呼び出すことによってバイナリデータ(データベースからClobとして抽出されたCSVファイル)をブラウザにストリーミングしています。通常、データをコピーするときにBufferedOutputStreamにOutputStreamをラップします。BufferedOutputStreamを閉じると、基礎となるOutputStreamも閉じますか?

BufferedOutputStreamをクローズするか、これによって基礎となるOutputStreamも閉じる必要がありますか?

[エクストラ質問:?私はこのケースではなBufferedOutputStreamを使用する必要はありますか応答がすでにバッファリングされている]

答えて

12

はい、それはそれを閉じます。あなたがそれを閉じなければならないかどうかについては、応答ストリームに何か他のものを書くことを期待していますか?もしそうでなければ、私はそれを閉じてもいいと思う。それを閉じないと、明らかにそれをフラッシュする必要があります - しかし、私はあなた自身のためにそれを理解することができると思う:)

実際に振る舞いはFilterOutputStreamから継承されています。

そのflushメソッドを呼び出し、その基礎となる 出力ストリームのcloseメソッドを呼び出し FilterOutputStreamのcloseメソッド:FilterOutputStream.close状態のためのJavadoc。

バッファリングする必要があるかどうかは、これが明確に定義されているかどうかはわかりません。サーブレットの仕様に埋もれている可能性もあります(設定が必要な場合もありますが、実際にはバッファリングが必要ない場合もありますが、レスポンス全体をバッファリングすることができれば、書いています)。

4

BufferedOutputStreamを閉じると、基礎となるOutputStreamも閉じます。 になります。BufferedOutputStreamを閉じて、その内容をフラッシュしてから、基になるストリームを閉じます。あなた自身を説得するために、FilterOutputStream.close()(BufferedOutputStreamが拡張される)の実装を見てください。

あなたのサーブレットに与えられた応答ストリームがバッファリングされているかどうかは、サーブレットコンテナの実装によって決まると思います。 FWIW Tomcatは、コンテンツ長のHTTPヘッダーを設定しようとすると、デフォルトでサーブレットの応答ストリームをバッファしていることを知っています。

関連する問題