2009-12-01 97 views

回答

59

你確實不需要這樣做。拇指規則:如果您沒有使用new SomeOutputStream()自己創建/打開它,那麼您不需要自己關閉它。如果它是例如new FileOutputStream("c:/foo.txt"),那麼你顯然需要自己關閉它。

有些人仍然這樣做的原因只是爲了確保沒有更多的東西會寫入響應主體。如果它會發生,那麼這將導致應用服務器日誌中的IllegalStateException,但這不會影響客戶端,所以客戶端仍然得到正確的響應。這也是一個更容易的調試,可以發現請求 - 響應鏈中潛在的問題,而您一眼就看不到這些問題。例如,別的東西就是將更多的數據附加到鏈中更下方的響應主體。

您在初學者中看到的另一個原因是他們只是想要阻止將更多數據寫入響應主體。當JSP在響應中錯誤地扮演角色時,您經常會看到這種情況。他們只是忽略日誌中的IllegalStateException。不用說這個特殊用途是不好

+1

如果您打開另一個InputStream來封裝流,則可能需要關閉該流,因爲容器將無法識別包裝流(可能包含未提交的字節)。理想情況下,你只需flush()包裝流,如果它是像BufferedOutputStream,但我發現當使用CipherOutputStream,這個類不完全寫入數據(我相信在這種情況下有很好的理由)。 在這種情況下,有必要調用close()方法來獲取正確的響應。 –

8

不,你不需要關閉它。如果你是基本結束對客戶的迴應。在關閉流之後,直到下一個請求才能向客戶端發送任何其他內容。你沒有打開這個流,所以你不必關閉它。

+14

對。就像在農場上一樣:按照你找到的那樣離開大門。 – erickson