有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

打开文件错误太多,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个文件的这个方法,它似乎没有问题

您是否看到我在上面粘贴的代码中有任何会导致此问题的错误


共 (3) 个答案

  1. # 1 楼答案

    不要将MappedByteBuffer用于这个琐碎的任务。没有明确的发布时间。只需打开文件,读取它,关闭它

  2. # 2 楼答案

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


    除非显式垃圾收集被禁用(-XX:-DisableExplicitGC),否则您应该能够通过捕获异常、调用System.gc()并重试来测试这一点。如果第二次尝试成功,那就是你的问题。然而,将System.gc()称为永久修复是一个坏主意。总体性能最佳的解决方案需要在目标平台上进行一些评测

  3. # 3 楼答案

    我认为您打开的文件太多,无法执行fast,请尝试添加wait()来测试这一点。 然后添加一个静态计数器来跟踪打开的文件,如果许多文件已经打开,则添加一个等待机制