Подтвердить что ты не робот

Нерекурсивный способ получить все файлы в каталоге и его подкаталогах в Java

Я пытаюсь получить список всех файлов в каталоге и его подкаталогах. Мой текущий рекурсивный подход выглядит следующим образом:

private void printFiles(File dir) {
  for (File child : dir.listFiles()) {
    if (child.isDirectory()) {
      printFiles(child);
    } else if (child.isFile()) {
      System.out.println(child.getPath());
    }
  }
}

printFiles(new File("somedir/somedir2"));

Однако я надеялся, что это будет нерекурсивный способ (существующий вызов API). Если нет, это самый чистый способ сделать это?

4b9b3361

Ответ 1

Вы всегда можете заменить рекурсивное решение на итеративный с помощью стека (для DFS) или очереди (для BFS):

private void printFiles(File dir) {
  Stack<File> stack = new Stack<File>();
  stack.push(dir);
  while(!stack.isEmpty()) {
    File child = stack.pop();
    if (child.isDirectory()) {
      for(File f : child.listFiles()) stack.push(f);
    } else if (child.isFile()) {
      System.out.println(child.getPath());
    }
  }
}

printFiles (новый файл ( "somedir/somedir2" ));

Ответ 2

FileUtils Возможно, это лучший способ. (КОПИЯ СВЯЗАННОГО ВОПРОСА) только отправленные, поэтому люди, которые ищут это, увидят его и, вероятно, не прочитают комментарии

edit: методы, используемые Listfiles

Ответ 3

Java 8 onward, вы можете использовать Files # walk, чтобы перечислить все файлы и каталоги рекурсивно в заданном каталоге. Кроме того, вы можете применить фильтр как Files::isRegularFile для фильтрации каталогов, если вам нужны только обычные файлы.

С другой стороны, если вам нужно только указать данный каталог, но не его подкаталоги, вы можете использовать ленивый метод Список файлов #/a > , который предоставит вам только файлы и каталоги в данном каталоге. Вы можете снова применить фильтр, упомянутый выше.