5

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

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

4

3 回答 3

3

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


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

于 2012-11-03T00:20:02.353 回答
2

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

于 2012-11-03T00:46:43.297 回答
-1

我认为您打开的文件太多太快,请尝试添加一个 wait() 来测试它。然后添加一个静态计数器来跟踪打开的文件,如果许多文件已经打开,添加一个等待机制......

于 2012-11-03T00:21:38.387 回答