如何减少在不断添加文件的目录中列出文件的时间

How to reduce time of listing files in a directory in which files are being added continously

我必须使用 FileFilter(基于日期修改)过滤目录中的文件。文件不断被添加到这个目录。 我正在使用线程池执行器来处理 FileFilter accept() 方法返回的每个文件。

但是列出此目录中的所有文件所花费的时间很长,这会减慢我的代码的完成时间。这是由于目录中不断添加文件。

有没有其他方法可以更快地列出文件。请注意,我需要在某个修改时间之前修改过的文件,并且正在通过 FileFilter 检查。

final ThreadPoolExecutor executor = poolFactory.getExecutor();
    FileFilter fileFIlter = new FileFilter() {

          @Override
          public boolean accept(File file) {

            if (file.getName().toUpperCase().contains(fileNameFilter) &&
                null != startDate && file.lastModified() >= startDate.getTime() &&
                null != endDate && file.lastModified() <= endDate.getTime()
                ) {

              executor.execute(new FileFinder(file, textFinder));

              return true;
            }
            return false;
          }
        };

        file.listFiles(fileFIlter);

没有更快的读取目录的方法。这不是 Java 问题。简单的说,操作系统只有"indexes"一个目录的名字。任何其他形式的查找/查询都需要通过迭代所有条目(一次一个)并检索和测试文件属性来实现。

唯一比这更好的方法是首先扫描目录(在应用程序启动时),然后使用文件观察器服务查找任何更改。第一次扫描的时间与当前一样长,但使用文件观察器可避免重复扫描。

如果这对您不起作用,那么您将需要以不同的方式管理您的文件。例如:

  • 也许您可以使用 File.rename 在处理完文件后将文件移动到另一个目录。

  • 也许您可以将传入信息附加到现有文件的末尾,而不是创建新文件。

  • 也许您可以将信息(直接)放入数据库,而无需中间文件。


如果您不能执行以上任一操作,那么很抱歉,没有办法让它运行得更快。