0
  1. 我有一個名爲abc.txt的文件。方法級別資源(例如:FileInputStream,Connection)未關閉,對象是否有資格進行垃圾回收,資源是否會關閉?

  2. 我由通過到其的連接:

    的FileInputStream FS =新的FileInputStream( 「的abc.txt」);

  3. 這位於方法級別。

  4. 如果我不關閉連接,對象是否有資格進行垃圾回收?

  5. 資源是否會關閉?

程序範例:

class Hello { 
public void readFile(){ 
FileInputStream fs = new FileInputStream("abc.txt"); 
/* 
here i wont close the connection 

*/ 
} 

} 
class Demo { 
public static void main(String args[]) { 
Hello h = Hello(); 
    h.readFile(); 
/* 
Some other operation 
*/ 
} 
} 

方案2:在主方法I取消引用小時。

class Demo { 
    public static void main(String args[]) { 
    Hello h = Hello(); 
    h.readFile(); 
    h = null;//Dereference 
    } 
} 

現在是這個h對象有資格進行垃圾回收。 (注意:資源連接沒有關閉)

+0

一般經驗法則,如果你打開,你必須關閉它。由於資源可能包含對其他不符合垃圾回收條件的對象的引用,因此無法100%確定該資源是否會被關閉。 – MadProgrammer 2015-03-19 03:33:28

回答

0

本地資源 - 即任何訪問java堆外的東西,比如底層操作系統的文件句柄 - 通常需要手動資源管理,即必須關閉/釋放。

某些類自動關閉對象定稿,但這是非常不可靠的,因爲在大堆定稿可以推遲到未來無限期。
所以你真的不應該依賴那個,因爲它消耗資源的時間不可預測。

其他類可能會保留資源分配,直到VM退出。在某些情況下可能根本不會發生一些清理,例如如果虛擬機不能幹淨地退出,臨時文件可能不會被刪除。

如果有疑問,read the javadocs有問題。

在您的特定玩具的例子VM退出很可能在之前的垃圾收集踢出現。

通常應該使用try-with-resource語句輸入流。