Навигация по каталогам в Java

Навигация по каталогам в Java

16 июля 2023 г.
Мы обсудим, как работать с каталогами, подкаталогами и перемещаться по ним с помощью Java и метода DirectoryStream. Узнать больше.

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

    Использование метода listFiles() класса File Использование DirectoryStream в Java 7 и выше Использование статического метода Files.list() в Java 8 и более поздних версиях Использование метода walk() в Java 8 и более поздних версиях

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

ПОСМОТРЕТЬ: Лучшие IDE для Java

Метод File listFiles() в Java

listFiles() — это метод экземпляра класса java.io.File. Чтобы использовать его, все, что нужно сделать разработчику, — это создать экземпляр нового объекта File, указав путь к конструктору, а затем вызвать для него listFiles(). listFiles() возвращает массив объектов File, которые программисты могут затем перебирать, чтобы получить дополнительную информацию об отдельных файлах и/или выполнить над ними операции. Вот простой пример, в котором перечислены все файлы и каталоги в папке Windows «C:\My Documents»:

пакет com.developer;

импортировать java.io.File;

открытый класс ListFilesExample {
  public static void main(String[] args) {
    // Сохраняем имена файлов и каталогов
    // в массиве файлов.
    // Не забудьте экранировать символ обратной косой черты!
    File[] files = new File("C:\\My Documents").listFiles();
    
    // Проходим по массиву файлов
    для (Файл файл : файлы) {
      // Если подкаталог найден,
      // вывести имя подкаталога
      если (файл.isDirectory()) {
        System.out.println("Каталог: " + file.getName());
      }
      еще {
        // Печатаем имя файла
        System.out.println("Файл: " + file.getName());
      }
    }
  }
}

Вот частичный список найденных каталогов и файлов:

Справочник: ААМС
Каталог: Захватывающие барабаны
Каталог: Угловой
Каталог: angular-starter
Каталог: Любой конвертер видео
Каталог: статьи
Файл: Аватар — Дом Вечной Охоты — transposed.tg
Файл: Avatar - House Of Eternal Hunt.tg
Файл: Avatar - Legend Of The King.tg
Каталог: bgfx

Рекурсивный обход каталога в Java

Поскольку мы можем тестировать каталоги, мы можем переместить наш цикл for в отдельный метод, который мы можем вызывать рекурсивно для вывода списка файлов подкаталогов, а также тот, который предоставлен нашему методу, как показано в следующем примере кода Java:

пакет com.developer;

импортировать java.io.File;

открытый класс RecursiveListFilesExample {

  public static void main(String[] args) {
    listFilesInDirectory(новый файл("C:\\Мои документы"));
  }
  
  private static void listFilesInDirectory(File dirPath) {
    File filesList[] = dirPath.listFiles();
    
    // Проходим по массиву файлов
    for (Файл файл : список файлов) {
      // Если подкаталог найден,
      // вывести имя подкаталога
      если (файл.isDirectory()) {
        System.out.println("Каталог: " + file.getName());
        списокФайловВКаталоге(файл);
      }
      еще {
        // Печать имени файла, присутствующего в заданном пути
        System.out.println("Файл: " + file.getName());
      }
    }
  }
}

Мы видим в выводе программы, что теперь она также перечисляет файлы подкаталогов:

Справочник: ААМС
Файл: AAMS V3 Manual.pdf
Файл: AAMS V4 Setup.exe
Файл: AAMS.xml
Файл: Лицензия.txt
Файл: Version.txt
Каталог: Захватывающие барабаны
Каталог: Настройки
Файл: MidifileDatabaseCache.dat
Файл: Recent.dat

ПОСМОТРЕТЬ: Лучшие онлайн-курсы по Java для изучения Java

Использование DirectoryStream для циклического просмотра файлов с помощью Java

Java 7 представила альтернативу listFiles() под названием DirectoryStream. Он хорошо работает с конструкцией for-each, позволяя нам перебирать содержимое каталога вместо того, чтобы читать все сразу.

В приведенном ниже примере кода показано, как использовать DirectoryStream Java в методе для вывода списка файлов каталога:

public Set listFilesUsingDirectoryStream(String dir) выдает IOException {
  Set fileSet = new HashSet<>();
  try (DirectoryStream поток = Files.newDirectoryStream(Paths.get(dir))) {
    для (Путь путь: поток) {
      если (!Files.isDirectory(путь)) {
        fileSet.add(path.getFileName()
          .нанизывать());
      }
    }
  }
  вернуть набор файлов;
}

Выше мы позволили Java обрабатывать закрытие ресурса DirectoryStream с помощью конструкции try-with-resources. Мы можем использовать статический метод Files.isDirectory(path) для фильтрации каталогов и возврата набора файлов в папке.

Использование статического метода Files.list()

В Java 8 появился новый метод list() в java.nio.file.Files. Метод списка возвращает лениво заполненный поток записей в каталоге. Таким образом, он более эффективен для обработки больших папок. Вот метод, который возвращает набор имен файлов:

public Set listFilesUsingFilesList(String dir) выдает IOException {
  try (Stream stream = Files.list(Paths.get(dir))) {
    обратный поток
      .filter(файл -> !Files.isDirectory(файл))
      .map(Путь::getFileName)
      .map(Путь::toString)
      .collect(Коллекторы.toSet());
  }
}

Хотя приведенный выше код может выглядеть аналогично listFiles(), он отличается тем, как разработчики получают путь к каждому файлу.

Опять же, мы создали поток, используя конструкцию try-with-resources, чтобы гарантировать, что ресурс каталога будет закрыт после чтения потока.

Как пройтись по содержимому каталога в Java

Метод walk() возвращает Stream, обходя дерево файлов, начиная с заданного начального файла/каталога в порядке глубины (это означает, что он начинается с файла/каталога наибольшей глубины). Следующая программа печатает полные пути к файлам для полного дерева файлов в папке «C:\My Documents»:

импортировать java.io.IOException;
импортировать java.nio.file.Files;
импортировать java.nio.file.Path;
импортировать java.nio.file.Paths;
импортировать java.util.stream.Stream;

класс FilesWalkExample {

  public static void main (аргументы String [])
    бросает IOException {
  
    // Создаем блок try-catch и
    // указать путь к каталогу локальной машины
    try (Stream filepath = Files.walk(Paths.get("C:\\My Documents"))) {
      // Выводим полный путь к каталогам и файлам
      путь к файлу.forEach(System.out::println);
    }
    // Выбросить, если каталога не существует
    поймать (IOException e) {
      выбросить новое IOException("Каталог не найден!");
    }
  }
}

Первые несколько строк вывода подтверждают, что обход файла начал наибольшую глубину:

I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy\page1.html
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy\page2.html
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy\page3.html
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\readOnlyPage.html
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\rectangles.html
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\Redirect.aspx
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\Redirect.aspx.cs
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\resultPage.html

Мы также можем включить каталоги, удалив условие фильтра Files::isRegularFile.

Заключительные мысли о навигации по каталогам в Java

Java предоставляет несколько способов обхода каталога, в зависимости от используемой версии. Хотя мы рассмотрели основные из них, в Java есть и другие способы навигации по каталогам, особенно с учетом того, что Stream API был представлен в Java 8.

ПОСМОТРЕТЬ: Обзор инструмента автоматизации сборки Maven


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE