2010-11-04 174 views
1

我用下面的代碼將一些數據寫入文件:java.io.FileNotFoundException(打開的文件太多)

BufferedWriter writer = null; 
try { 
    writer = new BufferedWriter(new FileWriter(file)); 
    writer.write(...); 
    writer.flush(); 
} 
finally { 
    if (writer != null) 
     writer.close(); 
} 

多次調用該方法後,我得到了一個FileNotFoundException異常,因爲太多的文件打開。

顯然,當我關閉作家流Java沒有關閉該文件句柄。單獨關閉FileWriter不會有幫助。

有沒有......我可以做到強制Java關閉文件?

+0

你能發佈你的stacktrace嗎?你是否在多線程環境中使用它? – darioo 2010-11-04 09:43:44

+0

嘗試在'writer.close()'周圍添加'try .. catch,以捕捉那裏的任何問題。 – 2010-11-04 09:44:12

回答

1

沒有,Java那樣關閉文件當您關閉作家處理。它實際上使用Decorator pattern建成。因此,它一定是別的。顯示堆棧跟蹤。

+0

堆棧跟蹤僅指向我發佈的代碼。但你說得對,問題在別的地方。 – Patrick 2010-11-10 10:17:49

1

this thread約寫入文件,好的建議有..注意在Anons答覆finally塊。

0

的BufferedWriter關閉基礎流。可能這是一個多線程問題。您可以保留FileOutputStream的一個實例並關閉它。喜歡的東西:

 
java.io.FileOutputStream out = new java.io.FileOutputStream(file); 
try { 
    // make buffered writer, etc. 
} finally { 
    out.close(); 
} 

2

您的代碼看起來不錯。它可能是泄漏文件句柄的應用程序的另一部分。

您可以監視的文件句柄使用lsof在Linux或pfiles在Solaris上。在Windows上,您可以使用ProcessExplorer

+1

你說得對。如果我只運行我發佈的代碼,則不會發生該問題。雖然它拋出了異常,因爲沒有更多的文件需要打開。似乎我必須找到其他地方的泄漏。 – Patrick 2010-11-10 10:14:10