如何遍历大目录的目录树而忽略文件



我需要遍历网络驱动器上的目录,并在层次结构中创建子到父的映射。一个典型的目录是6tb,包含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的期望。

您正在使用的方法是获取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);
}

正如你所看到的,它没有做任何你不需要它做的事情。

文件漫步器似乎比file . listfiles()工作得快得多。问题似乎是Java Webstart。当我在Java Webstart下运行应用程序时,大约需要30分钟。当我从Eclipse中运行应用程序时,它需要几分钟。Java Webstart只是在性能方面杀死了我们。

这个应用程序是一个非常数据/io密集型的应用程序,我注意到这个应用程序在Webstart下运行时的其他问题。解决方案是从Java Webstart迁移。

相关内容

  • 没有找到相关文章

最新更新