我使用以下代码将一些数据写入文件:
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 :(得分:2)
您的代码看起来很好。它可能是应用程序的另一部分,即泄漏文件句柄。
您可以使用Linux上的lsof
或Solaris上的pfiles
来监控文件句柄。在Windows上,您可以使用ProcessExplorer。
答案 1 :(得分:1)
不,Java会在关闭writer时关闭文件句柄。它实际上是使用Decorator pattern构建的。因此,它必须是别的东西。显示堆栈跟踪。
答案 2 :(得分:1)
请参阅this thread关于写入文件的信息,那里有很好的提示..注意Anons回复中的finally块。
答案 3 :(得分:0)
BufferedWriter关闭基础流。可能这是一个多线程问题。您可以保留FileOutputStream的实例并将其关闭。就像是:
java.io.FileOutputStream out = new java.io.FileOutputStream(file); try { // make buffered writer, etc. } finally { out.close(); }