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?基本上是的。底线是:不要假设你会得到一个特定的订单,因为没有保证。