2009-09-15 262 views
11

我通過調用response.getOutputStream()將二進制數據(從數據庫中提取的CSV文件作爲Clob)傳輸到瀏覽器,並且在複製數據時通常會將OutputStream包裝在BufferedOutputStream中。關閉BufferedOutputStream是否也會關閉底層OutputStream?

我應該關閉BufferedOutputStream還是關閉底層OutputStream?

[額外的問題:我需要在這種情況下使用的BufferedOutputStream或已經緩衝的響應]

回答

12

是的,它關閉它。至於是否應該關閉它 - 您是否期望向響應流寫入任何其他內容?如果不是,我認爲關閉它是很好的。如果你不關閉它,你應該明顯地衝洗它 - 但我懷疑你可以自己找出那一點:)

該行爲實際上是從FilterOutputStream繼承。的Javadoc爲FilterOutputStream.close狀態:

FilterOutputStream close方法 調用其flush方法,然後調用 其底層 輸出流的關閉方法。

至於你是否應該緩衝它 - 我不確定這是明確的。它可能被隱藏在servlet規範中 - 甚至可能是可配置的(有時候你真的不想緩衝,但是如果你可以緩衝整個響應,這意味着如果事情出錯後你可以提供更好的錯誤頁面)已經開始寫作)。

4

關閉BufferedOutputStream也會關閉底層的OutputStream。您應該關閉BufferedOutputStream,以便在關閉基礎流之前刷新其內容。查看FilterOutputStream.close()的實現(BufferedOutputStream從哪個擴展中)來說服你自己。

我猜測給你的servlet的響應流是否被緩衝取決於你的Servlet容器的實現。 FWIW我知道Tomcat在默認情況下會緩衝它的servlet響應流,以嘗試設置內容長度HTTP標頭。

相關問題