2015-11-08 167 views
0

我已經看到了這個問題之前,要求在這裏,但我沒有看到問題都在我的代碼:java.io.FileNotFoundException:Output.txt的(打開的文件太多)

public static void append(String text) { 
    try (FileWriter fileWriter = new FileWriter("Output.txt", true); 
     BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); 
     PrintWriter out = new PrintWriter(bufferedWriter);) { 
     out.println(text); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

由於我使用try-with-resources語句,打開的文件應該自動關閉。

我也試了一下老式的方式,但仍然拋出了同樣的錯誤:

public static void append(String text) { 
    try { 
     FileWriter fileWriter = new FileWriter("Output.txt", true); 
     BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); 
     PrintWriter out = new PrintWriter(bufferedWriter); 
     out.println(text); 
     out.close(); 
     bufferedWriter.close(); 
     fileWriter.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

我不想增加打開文件的限制,因爲這個代碼不應該有超過1個文件反正隨時開放。沒有多線程在我的程序順便說一句。

+1

你能告訴我們這段代碼是如何使用的嗎?問題在於你的fileWriter一次又一次地被創建 –

+0

(1)你使用什麼操作系統? (2)在'append'之前打開了多少個文件(3)'old style code''finally finally' block – Dewfy

+1

舊的方式使用'finally'塊關閉資源。你不嘗試做。 –

回答

0

「打開的文件太多」,所以基本上用Unix的說法是-EMFILE

我們將在這裏假設Java 7+。和你的第一個問題是,你不處理你的資源的正常關閉,因此使其使用java.nio.file相反,我們將改變你的代碼,以及嘗試與 - 資源:

public static void append(final String text) 
{ 
    final Path path = Paths.get("Output.txt"); 
    try (
     final BufferedWriter writer = Files.newBufferedWriter(path, 
      StandardCharsets.UTF_8, StandardOpenOption.APPEND); 
    ) { 
     writer.write(text); 
     writer.newLine(); 
    } 
} 

而且,爲什麼每次添加一行時都要打開一個新的文件描述符?那就是我認爲的主要問題。

+0

感謝您的快速回答! 我發佈的第一個代碼使用try-with-resources。我會嘗試你發佈的代碼,一旦程序運行沒有錯誤,就會回到這裏。可能需要幾個小時。 再次感謝=) – user3907491

+0

有一個答案是一回事;現在,它能解決你的問題嗎?但就像我說的,我認爲這是一個XY問題。 – fge

+0

實施您的解決方案後,我仍然得到相同的錯誤,現在只是在nio包中... java.nio.file.FileSystemException:Output.txt:打開的文件過多 – user3907491

0

你的第一個代碼片段沒有什麼,它應該工作。 我最好的猜測是你的JVM沒有足夠的權限來訪問有問題的文件。如果您通過shell腳本啓動程序,請檢查啓動位置,可能您沒有對該目錄的rw權限,只能執行權限。通常情況下,答案就是它所表示的內容,也許機器上還有其他密集的進程,這些代碼正在運行,所以也許嘗試在其他位置運行並檢查。