Files.walkFileTree中的遍历顺序

时间:2012-05-01 10:47:55

标签: java filesystems java-7 java.nio.file

Files.walkFileTree访问同一级别的文件/目录的顺序是什么?

似乎没有按照大小,上次修改时间或名称的顺序访问它们。我在API documentation中找不到任何内容。

也许preVisitDirectory方法可用于指定访问顺序,但默认行为是什么?

2 个答案:

答案 0 :(得分:15)

根据the Java Tutorial中的此评论,未定义读取子目录的顺序:

  

首先深入了解文件树,但是您不能对访问子目录的迭代顺序做出任何假设。

至于文件的读取顺序,它取决于(在当前实现中)提供的DirectoryStream,即我的计算机上的sun.nio.fs.WindowsDirectoryStream。阅读the javadoc of DirectoryStream,你会看到:

  

迭代器返回的元素没有特定的顺序。

答案 1 :(得分:1)

java稍后可以为你排序,这就是我所做的。

public static void printy(Path rootDirPath) {
        //treesets to hold paths alphabetically
        TreeSet<Path> paths = new TreeSet<>();
        try {
            Files.walkFileTree(rootDirPath, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                    paths.add(dir);
                    return super.preVisitDirectory(rootDirPath, attrs);
                }
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    paths.add(file);
                    return super.visitFile(rootDirPath, attrs);
                }
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    return super.visitFileFailed(file, exc);
                }
                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    return super.postVisitDirectory(rootDirPath, exc);
                }
            });
        //I'm printing the contents alphabetically,.. your impl might vary
        paths.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

希望这有帮助