Java 在巨大的windows目录树中查找文件列表的最快方法
我有一个windows目录树,里面有大约1000000个文件。 我有一个用Java读取的文本文件,包含一些文件名(大约100000个),我想检查每个文件名——如果它存在于目录中(如果是——给我一个文件的完整路径) 已经尝试过这些选项: 一,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 也许我可以实现一个预排序之类的,把所有的文件放在一起,按名称排序,然后使用一些散列方法按名称查找名
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
}
}