在巨大的 Windows 目录树中查找文件列表的最快方法

问题描述 投票:0回答:1

我有一个 Windows 目录树,里面有大约 1,000,000 个文件。 我有一个用 Java 读取的文本文件,包含一些文件名(大约 100,000 个),我想检查每个文件名 - 是否存在于目录中(如果是 - 给我文件的完整路径)。

已经尝试过这些选项:

1.

File folder = new File("your/path");
File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) {
  if (listOfFiles[i].isFile()) {
    System.out.println("File " + listOfFiles[i].getName());
  } else if (listOfFiles[i].isDirectory()) {
    System.out.println("Directory " + listOfFiles[i].getName());
  }
}

2.

public void func(String path, String name)
{

    Path folder = Paths.get(path);
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder))
    {
        for (Path entry : stream) 
        {
            if(Files.isDirectory(entry))
            {
                func(entry.toString(), name);
            }
            else
            {
                if(FilenameUtils.removeExtension(entry.getFileName().toString()).equals(name))
                {
                    System.out.println(entry);
                }
            }
        }
    } 
    catch (IOException ex) {
    // An I/O problem has occurred
    }

}

到目前为止,所有这些选项都非常缓慢。 正如我猜测的,虽然所有文件都在同一个逻辑位置,但实际上每个文件都保存在硬盘驱动器的另一个位置,因此所有这些 IO 调用都花费了太多时间。

我在这里发现的另一个想法是 ISearchFolderItemFactory 接口,但我只找到了 C++ 的文档,而不是 Java 的文档。

也许我可以实现预排序或其他方法,将所有文件真正放在硬盘中,按名称排序,然后使用某种哈希方法按名称查找名称?

需要一些帮助...

java windows file-io
1个回答
0
投票

如果您想为此运行外部流程,我有一个很酷的解决方案给您

您可以使用aldente

刚刚完成了一个简单工具的开发,让您可以非常快速地做到这一点。

有两个主要关键功能

  1. getdent64 - 直接调用此系统调用,无需任何其他系统调用(例如统计信息),使其更快
  2. 多线程 - 通过创建大量线程来完成更多工作

find
fd
相比,速度快了3倍!

https://github.com/royreznik/al-dente

© www.soinside.com 2019 - 2024. All rights reserved.