Порядок обхода в файлах.walkFileTree
Каков порядок, в котором Files.walkFileTree
посещает файлы / каталоги на одном уровне?
Кажется, что он не посещает их в порядке размера, последнего измененного времени или имени. Я ничего не мог найти в документация по API либо.
возможно preVisitDirectory
метод может использоваться для указания порядка посещения, но что такое поведение по умолчанию ?
2 ответов
порядок чтения подкаталогов не определяется в соответствии с этим комментарием в учебник Java:
дерево файлов сначала проходит глубину, но вы не можете сделать никаких предположений о порядке итерации, который посещают подкаталоги.
что касается порядка чтения файлов, то он зависит (в текущей реализации) от поставляемого DirectoryStream
, которая составляет sun.nio.fs.WindowsDirectoryStream
на моем компьютере. Чтение javadoc DirectoryStream
, вы увидите, что:
элементы, возвращенный iterator в определенном порядке.
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();
}
}
надеюсь, что это помогает