Нерекурсивный способ получить все файлы в каталоге и его подкаталогах в 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). Если нет, это самый чистый способ сделать это?
Ответы
Ответ 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 > , который предоставит вам только файлы и каталоги в данном каталоге. Вы можете снова применить фильтр, упомянутый выше.