在我的程序中,我有循环扫描一堆文件并读取其内容。问题发生在大约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中运行了这个方法超过20,000个文件,似乎没有任何问题。
您是否发现上面粘贴的代码有任何问题会导致此问题?
答案 0 :(得分:3)
映射是可疑的。 MappedByteBuffer
可以比FileChannel
更长,并且在垃圾收集之前有效。您可能没有足够的垃圾来运行GC,但可能在特定平台上,文件句柄由未引用的缓冲区保留。
除非禁用显式垃圾收集(-XX:-DisableExplicitGC
),否则您应该能够通过捕获异常,调用System.gc()
并再次尝试来测试此问题。如果它在第二次尝试时起作用,那就是你的问题。但是,将System.gc()
称为永久修复是一个坏主意。总体上表现最佳的解决方案将在目标平台上进行一些分析。
答案 1 :(得分:2)
不要将MappedByteBuffer用于这个简单的任务。它们没有明确定义的发布时间。只需打开文件,阅读,关闭它。
答案 2 :(得分:-1)
我认为你打开太多文件来快速,尝试添加一个wait()来测试它。 然后添加一个静态计数器,用于保存打开文件的轨迹,如果许多文件已经打开,请添加等待机制......