我需要遍历网络驱动器上的目录并在层次结构中创建子到父的映射。一个代表目录是 6 Terrabytes,有 900,000 个文件和 900 个文件夹。我只关心文件夹而不关心文件。出于测试目的,我将没有文件的文件夹复制到另一个网络驱动器并在复制的版本上运行我的代码。仅遍历 900 个文件夹可能需要 10 秒。然而,迭代原始目录结构需要 30 分钟。看起来我们正在遍历所有 900,000 个文件,即使我们只是忽略它们。
有没有办法通过甚至不查看文件来加快速度?如果可以的话,我宁愿坚持使用纯 Java。通过 Windows 资源管理器浏览这个巨大的目录时,一点也不觉得慢。我的代码如下。
public static Map<String, String> findFolderPaths(File parentFolder) throws IOException {
Map<String, String> parentFolderMap = new HashMap<String, String>();
Files.walkFileTree(parentFolder.toPath(), new FolderMappingFileVisitor(parentFolderMap));
return parentFolderMap;
}
static class FolderMappingFileVisitor extends SimpleFileVisitor<Path> {
private Map<String, String> mapping;
FolderMappingFileVisitor(Map<String, String> map) {
this.mapping = map;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
File directory = dir.toFile();
mapping.put(directory.getName(), directory.getParent());
return FileVisitResult.CONTINUE;
}
}
编辑:
我没有提到的一个重要难题是我们正在 webstart 中运行该应用程序。我报告的时间来自生产,而不是开发。从 Eclipse 运行,时间比我对 FileWalker 的期望更高。