Как получить список всех файлов в каталоге и его подкаталогах java

Обновлено: 21.11.2024

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

В приведенной выше задаче довольно легко наблюдать простой шаблон рекурсии.

<р>1. Создайте объект File для основного каталога.
2. Получить массив файлов для основного каталога.
3. Если массив[i] является файлом:
-> Распечатать имя файла.
4. Если массив[i] является каталогом:
-> Распечатать имя каталога.
-> Получить массив файлов для текущего подкаталога.
-> Повторите шаги 3 и 4 с текущим подкаталогом.

<р>5. Повторите шаги 3 и 4 для следующего массива[i].

// Рекурсивная программа на Java для печати всех файлов
// в папке (и подпапках)

публичный класс GFG
static void RecursivePrint(File[] arr,int index,int level)
// условие завершения
if(index == arr.length)
возврат;

// вкладки для внутренних уровней
for (int i = 0; i < level; i++)
System.out.print("t");

// для файлов
if(arr[index].isFile())
System.out.println(arr[index].getName());

// для подкаталогов
else if(arr[index].isDirectory())
System.out.println("[" + arr[index].getName() + "] ");

// рекурсия для подкаталогов
RecursivePrint(arr[index].listFiles(), 0, level + 1);
>

// рекурсия для основного каталога
RecursivePrint(arr,++index, level);
>

// Метод драйвера
public static void main(String[] args)
// Указать полный путь к каталогу (изменить соответственно)
String maindirectoryPath = "C:UsersprutorDesktopTest";< /p>

// Файловый объект
File maindir = new File(maindirectoryPath);

// Вызов рекурсивного метода
RecursivePrint(arr,0,0);
>
>
>
Вывод:

********************************************************************************************************************************************* br />Файлы из основного каталога: C:UsersprutorDesktopTest
************************************** ***********
Cormen.pdf
Extra-Items.pdf
test.pdf
[Документы]
doc1.docx
/>doc2.doc
doc3.docx
ABC.pdf
JKL.pdf
[листы]
XXX.csv
YYY.csv
results.pdf
[Резюме]
[До 2016 года]
cv2012.doc
cv2021.doc
[До 2014 года]
cv2014.doc
cv2020.doc
cv2020.pdf
QA.doc
Testing.pdf

Ниже показана еще одна рекурсивная программа. Здесь мы используем рекурсию только для вложенных подкаталогов. Для файлов основного каталога мы используем цикл foreach.

// Рекурсивная программа на Java для печати всех файлов
// в папке (и подпапках)

общедоступный класс GFG
static void RecursivePrint(File[] arr, int level)
// цикл for-each для файлов основного каталога
for (File f : arr)
// вкладки для внутренних уровней
for (int i = 0; i < level; i++)
System.out.print("t");

else if(f.isDirectory())
System.out.println("[" + f.getName() + "]");

// рекурсия для подкаталогов
RecursivePrint(f.listFiles(), level + 1);
>
>
>

// Метод драйвера
public static void main(String[] args)
// Указать полный путь к каталогу (изменить соответственно)
String maindirectoryPath = "C:UsersprutorDesktopTest";< /p>

// Файловый объект
File maindir = new File(maindirectoryPath);

// Вызов рекурсивного метода
RecursivePrint(arr, 0);
>
>
>
Вывод:

********************************************************************************************************************************************* br />Файлы из основного каталога: C:UsersprutorDesktopTest
************************************** ***********
Cormen.pdf
Extra-Items.pdf
test.pdf
[Документы]
doc1.docx
/>doc2.doc
doc3.docx
ABC.pdf
JKL.pdf
[листы]
XXX.csv
YYY.csv
results.pdf
[Резюме]
[До 2016 года]
cv2016.doc
cv2015.doc
[До 2014 года]
cv2014.doc
cv2020.doc
cv2020.pdf
QA.doc
Testing.pdf

Многие приложения тем или иным образом обрабатывают файлы, а работа с файлами — одна из основных составляющих любого языка программирования.

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

Для простоты все примеры будут написаны для следующего дерева файлов:

Файл.список()

Самый простой способ вывести список имен файлов и папок в заданном каталоге без обхода подкаталогов — это вспомогательный метод .list() , который возвращает массив String s.

Мы делаем это, используя метод .list() для экземпляра файла:

Используя простой цикл for-each, мы перебираем массив и выводим String s.

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

Фильтр имени файла

Еще одна вещь, которую мы можем сделать с помощью метода .list(), — это создать FilenameFilter, чтобы возвращать только те файлы, которые нам нужны:

Выполнение этого фрагмента кода даст:

Файл.listFiles()

Подобно предыдущему методу, этот можно использовать для возврата имен файлов и каталогов, но на этот раз мы получаем их в виде массива объектов File, что дает нам возможность напрямую манипулировать ими:

Теперь давайте углубимся в файловую систему, используя рекурсию и еще несколько методов для использования с объектом File:

Файлы.walk()

В Java 8 и более поздних версиях мы можем использовать класс java.nio.file.Files для заполнения потока и его использования для просмотра файлов и каталогов, а также рекурсивного обхода всех подкаталогов.

Обратите внимание, что в этом примере мы будем использовать лямбда-выражения:

Бесплатная электронная книга: Git Essentials

Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

Здесь мы заполнили Stream с помощью метода .walk(), передав аргумент Paths. Класс Paths состоит из статических методов, которые возвращают Path на основе String URI, и с помощью Path мы можем легко найти файл.

Path , Paths , Files и многие другие классы принадлежат пакету java.nio, который был представлен в Java 7 как более современный способ неблокирующего представления файлов.

Затем с помощью Collections Framework создается список.

Выполнение этого фрагмента кода даст:

Заключение

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

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

Класс File пакета java.io представляет файл или каталог (пути) в системе. Этот класс предоставляет различные методы для выполнения различных операций с файлами/каталогами.

Чтобы получить список всех существующих файлов в каталоге, этот класс предоставляет класс файлов list() (возвращает имена) и ListFiles (возвращает объекты File) с различными вариантами.

Метод List()

Этот метод возвращает массив строк, который содержит имена всех файлов и каталогов на пути, представленном текущим (файловым) объектом.

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

Пример

Следующая программа на Java выводит список имен всех файлов и каталогов по пути D:\\ExampleDirectory.

Вывод

Метод ListFiles()

Этот метод возвращает массив, содержащий объекты (абстрактные пути) всех файлов (и каталогов) в пути, представленном текущим объектом (Файл).

Поскольку этот метод возвращает объекты каждого файла/каталога в папке. С его помощью вы можете получить доступ к свойствам файлов/каталогов, таким как размер, путь и т.д.

Пример

Следующая программа на Java выводит имя, путь и размер всех файлов по пути D:\\ExampleDirectory.

Вывод

Метод List(FilenameFilter filter)

Как указано в его сигнатуре, этот метод принимает объект FilenameFilter и возвращает массив String, содержащий имена всех файлов и каталогов на пути, представленном текущим (File) объектом. Но перенастроенный массив содержит имена файлов, которые отфильтрованы на основе указанного фильтра.

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

Пример

Следующая программа на Java печатает имена текстовых файлов по пути D:\\ExampleDirectory.

Вывод

Список текстовых файлов в указанном каталоге –

Метод ListFiles(FilenameFilter filter)

Этот метод принимает объект FilenameFilter и возвращает массив File, содержащий объекты всех файлов и каталогов на пути, представленном текущим объектом File. Но перенастроенный массив содержит файлы (объекты), которые фильтруются по имени

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

Пример

Следующая программа на Java выводит имя, путь и размер всех текстовых файлов по пути D:\\ExampleDirectory.

Вывод

Метод ListFiles(FileFilter filter)

Этот метод принимает объект FileFilter и возвращает массив File, содержащий объекты (File) всех файлов и каталогов на пути, представленном текущим объектом File. Но перенастроенный массив содержит файлы (объекты), которые фильтруются на основе свойства файла.

Используя этот метод, вы можете получить отфильтрованные файловые объекты файлов и каталогов в определенной папке на основе размера, пути, типа (файл или каталог) и т. д.…

Пример

Следующая программа на Java выводит имя, путь и размер всех файлов (не папок) по пути D:\\ExampleDirectory.

Научитесь использовать различные API-интерфейсы Java, такие как Files.list() и DirectoryStream, для рекурсивного отображения всех файлов, присутствующих в каталоге, включая скрытые файлы.

  • Для использования внешней итерации (для цикла) используйте DirectoryStream .
  • Для использования операций Stream API вместо этого используйте Files.list().

1. Список файлов только в заданном каталоге

1.1. Поток файлов с помощью Files.list()

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

  • Чтение всех записей файлов и каталогов с помощью Files.list().
  • Проверить, является ли данная запись файлом, используя PredicateFile::isFile.
  • Собрать все отфильтрованные записи в список.

1.2. DirectoryStream для циклического просмотра файлов

DirectoryStream является частью Java 7 и используется для перебора записей в каталоге в стиле цикла for-each.

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

2. Список всех файлов в данном каталоге и подкаталогах

2.1. Files.walk() для потока путей

Метод walk() возвращает Stream, обходя дерево файлов, начиная с заданного начального файла/каталога, в порядке "сначала в глубину".

Обратите внимание, что этот метод посещает все уровни файлового дерева.

Если вы хотите включить список экземпляров Path и для каталогов, удалите условие фильтра Files::isRegularFile.

2.2. Простая рекурсия

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

Обратите внимание, что если мы работаем с большим каталогом, использование DirectoryStream работает лучше.

3. Список всех файлов определенного расширения

Чтобы получить список всех файлов только с определенными расширениями, используйте вместе два предиката Files::isRegularFile и filename.endsWith(".extension").

В данном примере мы перечисляем все файлы .java в данном каталоге и во всех его подкаталогах.

4. Список всех скрытых файлов

Чтобы найти все скрытые файлы, мы можем использовать выражение фильтра file -> file.isHidden() в любом из приведенных выше примеров.

В приведенных выше примерах мы учимся использовать цикл API java 8 для рекурсивного обхода файлов в каталоге с использованием различных методов поиска. Не стесняйтесь изменять код и экспериментировать с ним.

Обработка файлов — важная тема в java. На собеседовании вы столкнетесь со многими вопросами по этой теме. Я рассмотрел некоторые из вопросов, заданных в интервью по работе с файлами: как сортировать текстовый файл, как найти наиболее повторяющееся слово в текстовом файле, подсчитать символы, слова и строки в текстовом файле, добавить текст в файл, сравнить два текстовых файла, настройка прав доступа к файлам и т. д. Здесь вы можете ознакомиться с другими программами для обработки файлов. Продолжая оттуда, в этом посте мы узнаем, как перечислить все файлы в каталоге в java с некоторыми простыми примерами вместе с кодом java 8.

Класс

java.io.File имеет 5 различных методов для получения списка всех файлов и каталогов в каталоге. На изображении ниже описаны эти методы и когда их использовать. В Java 8 в классе java.nio.file.Files представлены еще два метода. Мы также увидим их в конце.

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

Давайте рассмотрим несколько примеров того, как получить список всех файлов и папок в папке, используя описанные выше методы.

Пример метода File.list():

Пример метода File.listFiles():

File.listFiles(FilenameFilter filter) Пример метода:

File.listFiles(FileFilter filter) Пример метода:

Как перечислить только подкаталоги в каталоге?

Как рекурсивно вывести список всех файлов в каталоге и его подкаталогах?

Методы Java 8:

В Java 8 в класс java.nio.file.Files введены еще два метода для перебора файловой иерархии и получения списка всех файлов и каталогов в ней. Это — Files.walk() и Files.list(). Основное различие между этими двумя методами заключается в том, что Files.walk() рекурсивно обходит данный каталог и его подкаталоги, чтобы получить список всех файлов и папок в иерархии. Files.list() просматривает только текущий каталог. Давайте рассмотрим их подробно.

1) Stream Files.list(Path dir) вызывает исключение IOException

Этот метод возвращает ленивый Stream объектов Path, где каждый объект представляет запись в каталоге. Список не является рекурсивным.

2) Stream Files.walk(Начало пути, FileVisitOption... параметры) вызывает исключение IOException

Этот метод возвращает ленивый Stream объектов Path, проходя по дереву файлов с корнем в заданном начальном файле start. Листинг является рекурсивным. Это означает, что этот метод рекурсивно обходит данный каталог и его подкаталоги, чтобы получить список всех файлов.

Читайте также: