Java 8 предоставляет хороший поток для обработки всех файлов в дереве.
Files.walk(Paths.get(path))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Это обеспечивает естественный способ обхода файлов. Поскольку это поток, вы можете выполнять все приятные потоковые операции с результатом, такие как ограничение, группирование, отображение, ранний выход и т. Д.
ОБНОВЛЕНИЕ : Я мог бы отметить, что есть также Files.find , который принимает BiPredicate , который может быть более эффективным, если вам нужно проверить атрибуты файла.
Files.find(Paths.get(path),
Integer.MAX_VALUE,
(filePath, fileAttr) -> fileAttr.isRegularFile())
.forEach(System.out::println);
Обратите внимание, что, хотя JavaDoc исключает, что этот метод мог бы быть более эффективным, чем Files.walk , он фактически идентичен, разница в производительности может наблюдаться, если вы также извлекаете атрибуты файла в своем фильтре. В конце концов, если вам нужно отфильтровать атрибуты, используйте Files.find , в противном случае используйте Files.walk , в основном из-за перегрузок, и это более удобно.
ИСПЫТАНИЯ : В соответствии с просьбой я дал сравнение производительности многих ответов. Проверьте проект Github, который содержит результаты и контрольный пример .