Как выполнить итерацию файлов в каталоге в Java?

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

Вы можете использовать File#isDirectory() чтобы проверить, является ли данный файл (путь) каталогом. Если это true , то вы снова вызываете тот же метод с результатом File#listFiles() . Это называется рекурсией .

Вот пример базового запуска.

 public static void main(String... args) { File[] files = new File("C:/").listFiles(); showFiles(files); } public static void showFiles(File[] files) { for (File file : files) { if (file.isDirectory()) { System.out.println("Directory: " + file.getName()); showFiles(file.listFiles()); // Calls same method again. } else { System.out.println("File: " + file.getName()); } } } 

Обратите внимание, что это чувствительно к StackOverflowError когда дерево глубже, чем может стека JVM. Вместо этого вы можете использовать итеративный подход или хвостовую рекурсию , но это еще одна тема;)

Если вы используете Java 1.7, вы можете использовать java.nio.file.Files.walkFileTree(...) .

Например:

 public class WalkFileTreeExample { public static void main(String[] args) { Path p = Paths.get("/usr"); FileVisitor fv = new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println(file); return FileVisitResult.CONTINUE; } }; try { Files.walkFileTree(p, fv); } catch (IOException e) { e.printStackTrace(); } } } 

Если вы используете Java 8, вы можете использовать интерфейс streamа с java.nio.file.Files.walk(...) :

 public class WalkFileTreeExample { public static void main(String[] args) { try (Stream paths = Files.walk(Paths.get("/usr"))) { paths.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } } 

Проверьте class FileUtils в Apache Commons – в частности iterateFiles :

Позволяет итерацию по файлам в заданной директории (и, возможно, ее подкаталоги).

Для Java 7+ существует также https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html

Пример, взятый из Javadoc:

 List listSourceFiles(Path dir) throws IOException { List result = new ArrayList<>(); try (DirectoryStream stream = Files.newDirectoryStream(dir, "*.{c,h,cpp,hpp,java}")) { for (Path entry: stream) { result.add(entry); } } catch (DirectoryIteratorException ex) { // I/O error encounted during the iteration, the cause is an IOException throw ex.getCause(); } return result; } 

Использование org.apache.commons.io.FileUtils

 File file = new File("F:/Lines"); Collection files = FileUtils.listFiles(file, null, true); for(File file2 : files){ System.out.println(file2.getName()); } 

Используйте false, если вам не нужны файлы из подкаталогов.

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

Как уже отмечалось, это проблема рекурсии. В частности, вы можете посмотреть на

 listFiles() 

В java File API здесь . Он возвращает массив всех файлов в каталоге. Используя это вместе с

 isDirectory() 

чтобы увидеть, нужно ли вам еще раз рекурсивно, это хорошее начало.

Чтобы добавить с ответом @msandiford, как и в большинстве случаев, когда идет дерево файлов, вы можете выполнить функцию как каталог или какой-либо конкретный файл. Если u неохотно использует streamи. Можно переопределить следующие методы:

 Files.walkFileTree(Paths.get(Krawl.INDEXPATH), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { // Do someting before directory visit return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { // Do something when a file is visited return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { // Do Something after directory visit return FileVisitResult.CONTINUE; } }); 
  • Ошибка: (23, 17) Не удалось выполнить: junit: junit: 4.12
  • Сравнение строк - Android
  • Java: необходимо каким-то образом сократить этот код
  • Ввод пользователем петли до тех пор, пока не будут выполнены условия
  • Прочитайте stream дважды
  • Как работает импорт Java?
  • Исходный ресурс Android не найден?
  • Несколько файлов dex определяют / BuildConfig, не могут найти причину:
  • "'Void' type not allowed here" error (Java)
  • Изменение цвета нижней строки EditText с помощью appcompat v7
  • Как показать эллипсы в моем TextView, если он больше, чем 1 строка?
  • Interesting Posts

    Надежность транспорта Websocket (потеря данных Socket.io при повторном подключении)

    проверка нескольких текстовых полей с одинаковым именем с помощью jquery validator проверяет только первый ввод

    Перенаправление портов на маршрутизаторе с использованием одного и того же внутреннего номера порта на разных IP-адресах

    Как получить реальный размер базы данных MySQL?

    Почему Windows7 создает два раздела?

    В Microsoft Office Outlook 2010, как я могу вручную удалить почту, помеченную для удаления в папках IMAP?

    Понимание примера преобразования lvalue-to-rvalue

    Сохранять / назначать роли пользователей, прошедших проверку подлинности

    Окно оверлей системы Android

    android.os.NetworkOnMainThreadException. Нужно использовать асинхронную задачу?

    Связывание / группировка файла с папкой в ​​Windows, так что они оба перемещаются вместе

    jQuery: keyup для TAB-ключа?

    Windows, отображающая загрузочную информацию вместо загрузки

    Пример: двунаправленный сетевой разъем Android с использованием AsyncTask

    Подсоническое Vs NHibernate

    Давайте будем гением компьютера.