Нерекурсивный способ получить все файлы в каталоге и его подкаталогах в Java - PullRequest
13 голосов
/ 21 июля 2011

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

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) сделать это. Если нет, то это самый чистый способ сделать это?

Ответы [ 3 ]

26 голосов
/ 21 июля 2011

Вы всегда можете заменить рекурсивное решение на итеративное, используя стек (для 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(new File("abc/def.ghi"));
3 голосов
/ 16 ноября 2017

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

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

3 голосов
/ 21 июля 2011

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

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

...