2009-11-27 415 views
16

我有一些生產代碼,不會是這樣的:是有必要關閉從HttpServletRequest中返回的輸入流?

HttpServletRequest httpServletRequest 
... 
DataInputStream dis = new DataInputStream(httpServletRequest.getInputStream()) 

這些流從未明確關閉。我在這裏假設servlet容器管理這個(JBOss Web)。處理這個問題的正確方法是什麼?

+0

感謝您的反饋傢伙。我最初問這個問題是因爲我遇到了JBoss Web 2.1.2的問題(在JBoss 5.0.1中)。在處理分塊傳輸編碼時,ChunkedInputFilter可以永遠循環。我認爲這是我的代碼。在JBoss Web 2.1.3中有一個解決方案。 – Conor 2009-12-03 17:12:20

回答

25

如果你自己沒有打開/創建輸入流源,那麼你不一定需要關閉它。這裏你只是包裝請求的輸入流,所以你不一定需要關閉它。

如果你沒有通過例如自行打開輸入new FileInputStream("c:/file.ext")那麼你顯然需要自己關閉在finally塊。容器應該在引擎蓋下面這樣做。

+0

如果你調用start與'喜歡open'方法'openStream'從java.net.URL中,這是否意味着你自己打開了它,需要關閉它呢? – 2013-07-14 15:04:24

+1

我想唯一的例外是,如果你打開了新的流只是一個包裝:'新的BufferedInputStream(的inputStream)',那麼你可能不會需要關閉它,因爲它應該由誰開'inputStream'被關閉? – gerrytan 2014-02-08 02:26:20

+0

我想我們有'的URLConnection的getInputStream()'和'的getOutputStream()異常'作爲Oracle文檔狀態[(甲骨文文件)](http://docs.oracle.com/javase/tutorial/networking/urls/ readingWriting.html)流似乎被隱式打開。另外這款[計算器後(http://stackoverflow.com/questions/4844535/why-do-you-have-to-call-urlconnectiongetinputstream-to-be-able-to-write-out-to)描述了你不得不關閉,甚至壽你剛纔叫'弄...流()' – tObi 2014-08-08 12:33:10

3

容器將處理這個問題。 它始終是良好的編碼風格,您分配它的同一個地方,關閉資源。(我原來在這篇文章中寫錯了,我以爲你打開了這個流,應該仔細閱讀。)

8

你應該絕對不是你自己關閉這些流,這是容器的工作。這樣做可能會干擾請求生命週期,並且有些容器可能會對您造成嚴重的反對。

0

規範(高達3.0候選人)不說(據我可以告訴)。在沒有規範信息的情況下,您可能會受到實施的擺佈。

爲參考實現的源代碼上的Sun Servlet page提到:

參考實現被包括在Java EE 5 SDK以及在開源Java平臺企業版(Java EE)應用程序服務器,可通過java.net上的GlassFish項目獲得。 Servlet技術的參考實現源代碼可以從java.net上的svn存儲庫中獲得。有關GlassFish中所有webtier技術的更多信息,請參閱GlassFish Webtier頁面。

檢查行爲可能與您將得到的確切答案接近。