2012-01-30 3 views
0

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

Это взято из How do I iterate through the files in a directory in 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()); 
      } 
     } 
    } 

ответ

1

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

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

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

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

1

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

0

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

2

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

Смежные вопросы