Java Files.walkFileTree中的遍历顺序

Java Files.walkFileTree中的遍历顺序,java,filesystems,java-7,java.nio.file,Java,Filesystems,Java 7,Java.nio.file,文件.walkFileTree访问同一级别的文件/目录的顺序是什么 它似乎没有按大小、上次修改时间或名称的顺序访问它们。我也找不到任何东西 也许可以使用preVisitDirectory方法指定访问顺序,但默认行为是什么?读取子目录的顺序没有按照以下注释定义: 文件树是深度优先的,但不能对访问子目录的迭代顺序做出任何假设 至于读取文件的顺序,它取决于(在当前实现中)提供的DirectoryStream,即我的计算机上的sun.nio.fs.WindowsDirectoryStream。通过阅读,

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

它似乎没有按大小、上次修改时间或名称的顺序访问它们。我也找不到任何东西


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

读取子目录的顺序没有按照以下注释定义:

文件树是深度优先的,但不能对访问子目录的迭代顺序做出任何假设

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

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


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();
        }
    }
publicstaticvoidprinty(路径rootDirPath){
//按字母顺序保存路径的树集
树集路径=新树集();
试一试{
walkFileTree(rootDirPath,新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult preVisitDirectory(路径目录,基本文件属性属性属性)引发IOException{
添加路径(dir);
返回super.preVisitDirectory(rootDirPath,attrs);
}
@凌驾
公共文件VisitResult visitFile(路径文件,基本文件属性属性属性)引发IOException{
添加路径(文件);
返回super.visitFile(rootDirPath,attrs);
}
@凌驾
公共文件VisitResult visitFileFailed(路径文件,IOException exc)引发IOException{
返回super.visitFileFailed(文件,exc);
}
@凌驾
公共文件VisitResult postVisitDirectory(路径目录,IOException exc)引发IOException{
返回super.postVisitDirectory(rootDirPath,exc);
}
});
//我正在按字母顺序打印内容,…您的impl可能会有所不同
forEach(System.out::println);
}捕获(IOE异常){
e、 printStackTrace();
}
}

希望这有帮助

谢谢你的回答。所以Files.walkTreeFile会在某个时候调用Files.newDirectoryStream,返回的DirectoryStream取决于操作系统和/或jdk/jre?基本上是的。底线是:不要假设你会得到一个特定的订单,因为没有保证。