Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打开文件过多错误,java.io.FileNotFoundException_Java_File - Fatal编程技术网

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

打开文件过多错误,java.io.FileNotFoundException,java,file,Java,File,在我的程序中,我有一个循环,可以扫描一堆文件并读取它们的内容。这个问题发生在大约1500个文件的迭代过程中,似乎无法复制(或理解(我)) 问题是: java.io.FileNotFoundException: /path/to/file//myFile (Too many open files) 此方法的例外点: private static String readFileAsRawString(File f) throws IOException { FileInputStream

在我的程序中,我有一个循环,可以扫描一堆文件并读取它们的内容。这个问题发生在大约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();
    }
}
私有静态字符串readFileAsRawString(文件f)引发IOException{

FileInputStream=new FileInputStream(f);//映射是可疑的。
MappedByteBuffer
可以超过其
FileChannel
,并且在垃圾收集之前有效。您可能没有足够的垃圾来运行GC,但在特定平台上,文件句柄可能由未引用的缓冲区保留



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

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

不要将MappedByteBuffer用于这项琐碎的任务。没有明确定义的释放时间。只需打开文件,读取文件,关闭文件。

您在两种环境(QA和失败的环境)中使用了相同的操作系统吗不。生产系统是Linux,我的测试在Mac上运行,在关闭文件之前返回数据。这可能是造成问题的原因。尝试将return放在finally block之后。在返回之前调用finally,我相信我也会尝试关闭
文件通道
,可能是获取文件通道会创建新的文件句柄。什么让我担心的是我无法在我的机器(MAC)上重现这个问题,我肯定会在周一在Prod(Linux)中验证它的行为。为什么?速度和它有什么关系,为什么等待会有帮助?无法解释的猜测不是答案。-1.Apache的
FileUtils.readFileToString(f)
似乎是代码更少、更干净的解决方案。将在周一进行测试。