Dir recursion - что произойдет, если первый файл встретится с dir - PullRequest
0 голосов
/ 30 января 2012

Что произойдет, если первым файлом, с которым столкнется этот код, будет каталог.Почему он не игнорирует все остальные файлы в этом каталоге (следовательно, скрывая результаты)?

Это взято из Как перебирать файлы в каталоге в Java?

Я не пытаюсь оспорить, что этот код работает, но как он учитывает вышеприведенный сценарий?

 public static void main(String... args) {
        File[] files = new File("C:/").listFiles();
        showFiles(files);
    }

    public static void showFiles(File[] files) {
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("Directory: " + file.getName());
                showFiles(file.listFiles()); // Calls same method again.
            } else {
                System.out.println("File: " + file.getName());
            }
        }
    }

Ответы [ 4 ]

2 голосов
/ 30 января 2012

Когда первая запись, с которой она сталкивается, является каталогом, она рекурсивно вызывает showFiles() для работы с содержимым этого каталога. Когда этот вызов возвращается, цикл продолжается с записями от первого вызова до showFiles().

1 голос
/ 30 января 2012

Он просто выталкивает другой кадр стека, когда рекурсивный вызов завершается, он может возобновить с того места, где он ранее оставался.

1 голос
/ 30 января 2012

Он не игнорирует его, потому что он просто делает еще один рекурсивный вызов - исходный вызов (с коллекцией файлов с верхнего уровня) все еще находится в стеке. Он делает новый вызов с новым списком файлов, на который ссылается параметр новый , называемый files в новом фрейме стека .

Так что, если структура каталогов c:/a/b/c, вы получите стек:

showFiles([c:/a/b/c])
showFiles([c:/a/b])
showFiles([c:/a])
main(...)

Когда возвращается «самый глубокий» вызов (вершина стека), следующий кадр стека все равно будет знать о любых других файлах того же уровня и вполне может повториться снова.

0 голосов
/ 30 января 2012

Это работает, потому что переменная files является локальной переменной, то есть существует один экземпляр для каждого вызова метода showFiles. Таким образом, все выполнения методов не зависят друг от друга и не перекрывают их files переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...