2012-12-26 91 views
6

我想知道什麼是釋放文件資源/句柄的最佳/合適的方式。正確釋放I/O資源

傳統代碼,

BufferredInputStream stream = null 
try{ 
    ---- 
    stream = new BufferredInputStream(new FileInputStream()); 
    ---- 
} finally{ 
    if(stream != null){ 
    stream.close() 
    } 

}

將文件句柄被單獨關閉BufferredInputStream.close釋放或需要底層stream(i.e. FileInputStream.close())也被顯式調用。

P.S. Javadoc for [FilterOutputStream.close]方法指定它也將顯式關閉底層流。但其他流在文檔中似乎沒有。

[FilterOutputStream.close]: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterOutputStream.html#close%28%29 

請指教。提前致謝。

+0

只需關閉BufferredInputStream對象,然後嘗試操作FileInputStream並查看是否引發了封閉流的任何異常,就可以輕鬆對其進行測試。我相信它會被關閉,正如您在許多doc例子中看到的,底層流是匿名創建的 – giorashc

+0

只是一個建議:如果您使用的是JDK 7,請使用try-with-resources,它更簡單。請參閱[這裏](http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。 –

+0

感謝您的建議JavaNewbie_M107。 Java 7尚未添加​​到項目中。期待它 –

回答

4

您可以隨時檢查底層類的源代碼以確定確切的行爲。

但是,在這種情況下,在BufferedInputStream上調用close()也將關閉底層流,即FileInputStream

的源代碼可here

2

當多個流鏈接時,關閉最後構建的流將關閉基礎流。因此,收盤BufferedInputStream也將關閉標的FileInputStream

因此,您只需在一個流上調用close(),它將自動關閉底層流。

+0

感謝您的回覆。 javadoc沒有提到。有沒有任何參考或證據支持這個答案。我正在處理關鍵問題以阻止文件句柄泄漏。 –

+0

檢查Mr.Usman的答案中的鏈接。滾動到底部,您將看到close()方法的工作方式。它關閉了連接到BufferdInputStream的InputStream。 –

0

BufferredInputStream本身並不持有任何系統資源,使BufferredInputStream.close()將簡單的傳播千鈞一髮到它的InputStream包裝..所以它應該做的就好了。