Порядок обхода в файлах.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();
        }
    }

надеюсь, что это помогает