我需要遍历网络驱动器上的目录,并在层次结构中创建一个child to parent的映射。一个代表性目录是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的期望更多。
答案 0 :(得分:2)
您正在使用的方法是获取我怀疑正在访问每个文件的文件描述信息的BasicFileAttributes。
如果您只需要名称,我建议您反复/递归调用File.listFiles();这应该只获得你要求的信息。
像
这样的东西public static Map<String, String> findFolderPaths(File parentFolder) throws IOException {
Map<String, String> map = new HashMap<String, String>();
findFolderPaths(parentFolder, map);
return map;
}
public static void findFolderPaths(File dir, Map<String, String> map) throws IOException {
map.put(dir.getName(), dir.getPparent());
for(File file : dir.listFiles())
if (file.isDirectory())
findFolderPaths(file, map);
}
正如你所看到的,你不需要做任何事情。
答案 1 :(得分:0)
文件walker似乎比File.listFiles()工作得快得多。问题似乎是Java Webstart。当我在Java Webstart下运行应用程序时,大约需要30分钟。当我从Eclipse运行应用程序时,需要几分钟时间。 Java Webstart只是在性能方面杀死我们。
这个应用程序是一个非常数据/ io密集型应用程序,在Webstart下运行时,我注意到过去使用此应用程序的其他问题。解决方案是远离Java Webstart。