2010-11-04 105 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