2016-05-24 44 views
-3

我知道這可能會向下投票這個使用.close()是困擾我很多爲什麼我以往任何時候都需要在資源

我已經閱讀.close所有文章()方法類似

explain the close() method in Java in Layman's terms

Why do I need to call a close() or shutdown() method?

the usage of close() method(Java Beginner)

我有這些問題可能顯得太微不足道了

1.什麼呢詞「資源」恰恰意味着(是文件或「FileWriter的」對象或其他一些東西)(嘗試儘可能廣泛地解釋)

讓我們考慮下面的代碼

import java.io.*; 
public class characterstreams 
{ 
    public static void main(String []args) throws Exception 
    { 
     File f=new File("thischaracter.txt"); 
     FileWriter fw=new FileWriter(f); 
     char[] ch={'a','c','d'}; 
     fw.write('a'); 
     fw.write(ch); 
     fw.write("aaaa aaaaa aaaaaaa"); 
     fw.flush(); 
     FileReader fr=new FileReader(f); 
     int r=fr.read(); 
     System.out.println(r); 
     char[] gh=new char[30]; 
     System.out.println(fr.read(gh)); 
    } 
} 

編譯和執行它

ģ後:/>的java characterstreams

可以說,資源是FileWriter的下方(因爲我還沒有得到資源的意思)

JVM啓動並打開了所謂的資源,然後執行完成和JVM獲取之後,其執行後關閉

2.it解鎖,因爲它已經打開是不對的運行資源(糾正我,如果我錯了)

G:/>

在這一點上是JVM沒有運行

3.before書亭下來,垃圾收集器被稱爲是嗎?(糾正我,如果我錯了),這樣的FileWriter對象被摧毀 那麼,爲什麼我們應該關閉,我們已經開闢了

的所有資源和

4.again我讀了'資源被泄漏'這是什麼意思..?

+0

您正在考慮一個小而獨立的示例。無數的案例不適用。如果程序的一部分無限期地駐留在內存中(例如守護程序線程)會怎樣?或者,如果由於應用程序終止「不正確」而導致受影響的文件系統資源處於不一致狀態?等等 – Mena

+0

@Mena資源究竟意味着什麼...我已冒險投下所以試着解釋我...... – viru

+0

資源是由操作系統(磁盤訪問,套接字...)提供的, – mvera

回答

3

resource表示JVM和/或操作系統需要的任何東西,以便爲您提供您請求的功能。

接受你的例子。如果您一般打開一個FileWriter操作系統(取決於操作系統,文件系統等)。)會做(假設你想將文件刻錄光盤,像HDD/SDD)

  1. 創建請求的文件名
  2. 目錄項創建一個數據結構來保持寫作過程中對文件
  3. 分配磁盤空間,如果你真的將數據寫入到文件

(注意:這不是一個詳盡的列表)

點會爲你打開任何書面文件來完成。如果您不關閉resource,所有這些都保留在內存中,並且仍由操作系統維護。

假設您的應用程序正在運行很長時間並不斷打開文件。操作系統允許您保持打開的打開文件數量是有限的(具體數量取決於操作系統,配額設置...)。如果資源枯竭,某些事情會表現出意外或失敗。

查找下面在Linux上的一個小演示。

public static void main(String[] args) throws IOException { 
    List<OutputStream> files = new ArrayList<>(); 
    for (int i = 0; i < 1000; i++) { 
     files.add(Files.newOutputStream(Paths.get("/tmp/demo." + i), 
       StandardOpenOption.CREATE)); 
    } 
} 

該代碼打開一個thousend文件寫入。

假設你打開文件限制爲1024

ulimit -n 
1024 

運行段,然後將產生1000個文件/tmp/demo.*

如果你打開文件限制爲僅100碼將失敗

ulimit -n 100 
java.nio.file.FileSystemException: /tmp/demo.94: Too many open files 

(失敗之前的JVM本身具有一定的打開文件)

爲了防止這樣的問題(資源不足)您應該關閉不需要再寫入的文件。如果你不使用Java(close()),操作系統也不知道內存等是否可以釋放並用於其他請求。

相關問題