Вопрос-ответ

Recursively list files in Java

Рекурсивный список файлов в Java

Как мне рекурсивно перечислить все файлы в каталоге в Java? Предоставляет ли фреймворк какую-либо утилиту?

Я видел много хакерских реализаций. Но ни одна из фреймворка или nio

Переведено автоматически
Ответ 1

Java 8 предоставляет хороший поток для обработки всех файлов в дереве.

try (Stream<Path> stream = Files.walk(Paths.get(path))) {
stream.filter(Files::isRegularFile)
.forEach(System.out::println);
}

Это обеспечивает естественный способ обхода файлов. Поскольку это поток, вы можете выполнять все необходимые потоковые операции с результатом, такие как ограничение, группировка, сопоставление, досрочный выход и т.д.

ОБНОВЛЕНИЕ: я мог бы указать, что есть еще Files.найдите, который принимает двойное значение, что может быть более эффективным, если вам нужно проверить атрибуты файла.

Files.find(Paths.get(path),
Integer.MAX_VALUE,
(filePath, fileAttr) -> fileAttr.isRegularFile())
.forEach(System.out::println);

Обратите внимание, что, хотя JavaDoc ускользает от понимания того, что этот метод может быть более эффективным, чем Files.прогулка фактически идентична, разницу в производительности можно заметить, если вы также извлекаете атрибуты файла в своем фильтре. В конце концов, если вам нужно отфильтровать по атрибутам, используйте Files.find, в противном случае используйте Files.пройдемся, в основном потому, что есть перегрузки и так удобнее.

ТЕСТЫ: В соответствии с просьбой я предоставил сравнение производительности многих ответов. Ознакомьтесь с проектом Github, который содержит результаты и тестовый пример.

Ответ 2

УFileUtils есть iterateFiles методы и listFiles. Попробуйте их. (из commons-io)

Редактировать: Вы можете проверить здесь сравнение различных подходов. Кажется, что подход commons-io медленный, поэтому выберите некоторые из более быстрых отсюда (если это имеет значение)

Ответ 3

// Готов к запуску

import java.io.File;

public class Filewalker {

public void walk( String path ) {

File root = new File( path );
File[] list = root.listFiles();

if (list == null) return;

for ( File f : list ) {
if ( f.isDirectory() ) {
walk( f.getAbsolutePath() );
System.out.println( "Dir:" + f.getAbsoluteFile() );
}
else {
System.out.println( "File:" + f.getAbsoluteFile() );
}
}
}

public static void main(String[] args) {
Filewalker fw = new Filewalker();
fw.walk("c:\\" );
}

}
Ответ 4

Java 7 будет иметь имеет Files.walkFileTree:


Если вы укажете начальную точку и посетителя файла, он будет вызывать различные методы для посетителя файла при прохождении по файлу в дереве файлов. Мы ожидаем, что люди будут использовать это, если они разрабатывают рекурсивное копирование, рекурсивное перемещение, рекурсивное удаление или рекурсивную операцию, которая устанавливает разрешения или выполняет другую операцию над каждым из файлов.


Теперь есть целое руководство Oracle по этому вопросу.

java file