2013-10-25 130 views

回答

15

假設Class.getResourceAsStream()將始終返回一個指向您類的JAR文件內的文件的流。這是不正確的。您的類路徑也可能包含文件夾,在這種情況下,Class.getResourceAsStream()將返回FileInputStream。某些其他類加載器也可能會返回其他類型的資源,例如遠程文件(在URLClassLoader的情況下)。

即使在JAR文件的情況下,實現也可能會將JAR文件中的持久視圖維護到正在訪問的文件的壓縮字節。也許它是持有內存映射ByteBuffer ...

爲什麼要抓住機會?你應該總是關閉流(和任何其他可關閉的,真實的),不管它們是如何給你的。

至於檢測泄漏,最好的策略是在VM關閉時獲得內存轉儲,然後用某種工具對其進行分析。兩種流行的工具是jhatEclipse mat

4

返回的類型是一個輸入流,因此,無論具體實現(可能會從版本更改爲版本),都有一個應該調用imho的close()方法。

無論該方法是否真的在用當前版本做一些有用的事情。

5

作爲一個經驗法則,您應該關閉所有流(以及其他提供關閉功能的其他類型)。它可能會導致資源泄漏(內存是一種資源)。

雖然自動垃圾回收最終會在不再引用對象時回收內存,但仍可能保留可能不會釋放的本機資源。另外,如果其他長生命期的對象(例如類加載器)持續保留資源,它將不會被垃圾回收器聲明。

如果您的程序壽命短,或者您只打開少量資源,您可能不會遇到問題,但在長時間運行的應用程序中很難檢測到資源泄漏。

相關問題