打开文件错误太多,java。木卫一。FileNotFoundException
在我的程序中,我有一个循环,可以扫描一堆文件并读取它们的内容。这个问题发生在大约1500个文件的迭代过程中,似乎无法复制(或理解(我))
问题是:
java.io.FileNotFoundException: /path/to/file//myFile (Too many open files)
此方法的例外点:
private static String readFileAsRawString(File f) throws IOException {
FileInputStream stream = new FileInputStream(f); // <------------Stacktrace
try{
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
return Charset.defaultCharset().decode(bb).toString();
} finally {
stream.close();
}
}
我在QA中运行了超过20000个文件的这个方法,它似乎没有问题
您是否看到我在上面粘贴的代码中有任何会导致此问题的错误
# 1 楼答案
不要将MappedByteBuffer用于这个琐碎的任务。没有明确的发布时间。只需打开文件,读取它,关闭它
# 2 楼答案
地图是可疑的。一个
MappedByteBuffer
可以比它的FileChannel
寿命长,并且在垃圾回收之前是有效的。您可能没有足够的垃圾来运行GC,但可能在特定的平台上,文件句柄由未引用的缓冲区保留除非显式垃圾收集被禁用(
-XX:-DisableExplicitGC
),否则您应该能够通过捕获异常、调用System.gc()
并重试来测试这一点。如果第二次尝试成功,那就是你的问题。然而,将System.gc()
称为永久修复是一个坏主意。总体性能最佳的解决方案需要在目标平台上进行一些评测# 3 楼答案
我认为您打开的文件太多,无法执行fast,请尝试添加wait()来测试这一点。 然后添加一个静态计数器来跟踪打开的文件,如果许多文件已经打开,则添加一个等待机制