Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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 在巨大的windows目录树中查找文件列表的最快方法_Java_Windows_File Io - Fatal编程技术网

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

Java 在巨大的windows目录树中查找文件列表的最快方法,java,windows,file-io,Java,Windows,File Io,我有一个windows目录树,里面有大约1000000个文件。 我有一个用Java读取的文本文件,包含一些文件名(大约100000个),我想检查每个文件名——如果它存在于目录中(如果是——给我一个文件的完整路径) 已经尝试过这些选项: 一, File folder=新文件(“您的/path”); File[]listOfFiles=folder.listFiles(); for(int i=0;i 也许我可以实现一个预排序之类的,把所有的文件放在一起,按名称排序,然后使用一些散列方法按名称查找名

我有一个windows目录树,里面有大约1000000个文件。 我有一个用Java读取的文本文件,包含一些文件名(大约100000个),我想检查每个文件名——如果它存在于目录中(如果是——给我一个文件的完整路径)

已经尝试过这些选项:

一,

File folder=新文件(“您的/path”);
File[]listOfFiles=folder.listFiles();
for(int i=0;i
二,

public void func(字符串路径、字符串名称)
{
路径文件夹=路径。获取(路径);
try(DirectoryStream=Files.newDirectoryStream(文件夹))
{
for(路径条目:流)
{
if(Files.isDirectory(条目))
{
func(entry.toString(),name);
}
其他的
{
if(FilenameUtils.removeExtension(entry.getFileName().toString()).equals(name))
{
系统输出打印项次(输入);
}
}
}
} 
捕获(IOEX异常){
//发生I/O问题
}
}
到目前为止,所有这些选择都非常缓慢。 我猜,虽然所有文件都在同一个逻辑位置,但实际上每个文件都保存在硬盘驱动器的另一个位置,因此所有这些IO调用都需要花费太多的时间

我在这里发现的另一个想法是ISARCHHFLUDIRTEMFIZE接口,但我发现它的文档仅在C++中,而不是在java中。p> 也许我可以实现一个预排序之类的,把所有的文件放在一起,按名称排序,然后使用一些散列方法按名称查找名称


需要一些帮助…

问题中的代码片段不会遍历目录树。请显示您的实际代码,特别是用于保存10万个感兴趣文件名的数据结构,以及决定当前文件是否为感兴趣文件的一部分的数据结构。您一定要提前读取包含10万个文件名的文本文件,并将其存储在哈希集中。然后检查当前文件是否包含在集合中是有效的。有什么替代方法?是否为每个文件读入整个文件以签入文件系统?这似乎是您最大的性能问题。为什么您认为不可能事先读取文件并存储所有必要的信息,可能是在地图中?这就是为什么我最初要求的真正的代码。此外,您应该考虑遍历文件。它访问一个目录中的所有文件,包括所有子目录。如果我理解正确,您正在查询文件系统,查找大约100000行文件名列表中每行大约1000000个文件的名称?这似乎效率极低。如前所述,您应该首先将所有名称读入内存,然后只遍历文件树一次。正如您所说,您需要知道文件名在哪一行,您可以将它们存储在
映射中。
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());
  }
}
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
    }

}