打开文件错误太多,java.io.FileNotFoundException

时间:2012-11-02 23:59:51

标签: java file

在我的程序中,我有循环扫描一堆文件并读取其内容。问题发生在大约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个文件,似乎没有任何问题。

您是否发现上面粘贴的代码有任何问题会导致此问题?

3 个答案:

答案 0 :(得分:3)

映射是可疑的。 MappedByteBuffer可以比FileChannel更长,并且在垃圾收集之前有效。您可能没有足够的垃圾来运行GC,但可能在特定平台上,文件句柄由未引用的缓冲区保留。


除非禁用显式垃圾收集(-XX:-DisableExplicitGC),否则您应该能够通过捕获异常,调用System.gc()并再次尝试来测试此问题。如果它在第二次尝试时起作用,那就是你的问题。但是,将System.gc()称为永久修复是一个坏主意。总体上表现最佳的解决方案将在目标平台上进行一些分析。

答案 1 :(得分:2)

不要将MappedByteBuffer用于这个简单的任务。它们没有明确定义的发布时间。只需打开文件,阅读,关闭它。

答案 2 :(得分:-1)

我认为你打开太多文件来快速,尝试添加一个wait()来测试它。 然后添加一个静态计数器,用于保存打开文件的轨迹,如果许多文件已经打开,请添加等待机制......