В этой статье показано, как Java 8 Files.walk
для обхода дерева файлов и потоковой операции filter
для поиска файлов, которые соответствуют определенному расширению файла из папки и ее подпапок.
//найти файлы с соответствующим расширением `png` из папки C: \ test try (Stream walk = Files.walk (Paths.get (" C: \ test "))) {result = walk .filter ( p ->! Files.isDirectory (p))//не каталог .map (p -> p.toString (). toLowerCase ())//преобразовываем путь в строку .filter (f -> f.endsWith ("png "))//проверка завершения с помощью .collect (Collectors.toList ()); //собираем все, что соответствует списку}
В методе Files.walk
второй аргумент, maxDepth
определяет максимальное количество уровней каталогов для посещения. И мы можем назначить maxDepth = 1
для поиска файлов только из папки верхнего уровня (исключая все ее подпапки)
try (Stream walk = Files.walk (Paths.get ("C: \ test"), 1)) {//...}
Темы
- Найти файлы с указанным расширением (Files.walk)
- Найти файлы с кратными расширениями (Files.walk)
1. Поиск файлов с указанным расширением
В этом примере выполняется поиск файлов, соответствующих расширению png
. Находки начинаются с папки верхнего уровня C: \ test
и включают все уровни вложенных папок.
package com.mkyong.io.howto; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; открытый класс FindFileByExtension1 {public static void main (String [] args) {попробуйте {List files = findFiles (Paths .get ("C: \ test"), "png"); files.forEach (x -> System.out.println (x)); } catch (IOException e) {e.printStackTrace (); }} общедоступный статический список findFiles (Path path, String fileExtension) выбрасывает IOException {if (! Files.isDirectory (path)) {throw new IllegalArgumentException («Путь должен быть каталогом!»); } Список результат; try (Stream walk = Files.walk (path)) {result = walk .filter (p ->! Files.isDirectory (p))//это путь, а не строка,//это только проверка, если путь заканчивается определенным путем//.filter(p -> p.endsWith (fileExtension))//сначала конвертируем путь в строку .map (p -> p.toString (). toLowerCase ()) .filter (f -> f .endsWith (fileExtension)) .collect (Collectors.toList ()); } вернуть результат; }}
Вывод
c: test bk logo-new .pngc: test bk resize-default.pngc: test google.pngc: test test1 test2 java.png ...
2. Поиск файлов с несколькими расширениями
В этом примере выполняется поиск файлов с несколькими расширениями ( .png
, .jpg
, .gif
).
пакет com.mkyong.io. как; импорт java.io.IOException; импорт java.nio.file.Files; импорт java.nio.file.Path; импорт java.nio.file.Paths; импорт java.util.List; импорт java.util.stream. Сборщики; import java.util.stream.Stream; открытый класс FindFileByExtension2 {public static void main (String [] args) {попробуйте {String [] extensions = {"png", "jpg", "gif"}; Список файлов = findFiles (Paths.get ("C: \ test"), расширения); files.forEach (x -> System.out.println (x)); } catch (IOException e) {e.printStackTrace (); }} общедоступный статический список findFiles (Path path, String [] fileExtensions) выбрасывает IOException {if (! Files.isDirectory (path)) {throw new IllegalArgumentException («Путь должен быть каталогом!»); } Список результат; try (Stream walk = Files.walk (path, 1)) {result = walk .filter (p ->! Files.isDirectory (p))//конвертируем путь в строку .map (p -> p.toString () .toLowerCase ()) .filter (f -> isEndWith (f, fileExtensions)) .collect (Collectors.toList ()); } вернуть результат; } частное статическое логическое значение isEndWith (String file, String [] fileExtensions) {логический результат = false; for (String fileExtension: fileExtensions) {если (file.endsWith (fileExtension)) {результат = true; сломать; }} вернуть результат; }}
Вывод
c: test bk logo-new .pngc: test bk resize-default.gifc: test bk resize-fast.gifc: test bk resize.pngc: test google.jpgc: test google.pngc: test test1 test2 java.pngc: test test1 test2 java.jpg
2.2 Метод isEndWith ()
может быть короче с потоком Java 8 anyMatch
.
private static boolean isEndWith (String file, String [] fileExtensions) {//Java 8, попробуйте это логический результат = Arrays.stream (fileExtensions) .anyMatch (file ::ndsWith); вернуть результат; //олдскульный стиль/* логический результат = false; for (String fileExtension: fileExtensions) {если (file.endsWith (fileExtension)) {результат = true; сломать; }} return result; */}
2.3 Мы также можем удалить метод isEndWith ()
и поместить anyMatch
напрямую в фильтр
.
общедоступный статический список findFiles (Path path, String [] fileExtensions) выдает исключение IOException { if (! Files.isDirectory (путь)) {выбросить новое исключение IllegalArgumentException («Путь должен быть каталогом!»); } Список результат; try (Stream walk = Files.walk (path, 1)) {result = walk .filter (p ->! Files.isDirectory (p))//конвертируем путь в строку .map (p -> p.toString () .toLowerCase ())//.filter(f -> isEndWith (f, fileExtensions))//лямбда//.filter(f -> Arrays.stream (fileExtensions) .anyMatch (ext -> f. endWith (ext)))//ссылка на метод .filter (f -> Arrays.stream (fileExtensions) .anyMatch (f ::ndsWith)) .collect (Collectors.toList ()); } вернуть результат; }
2.4 Мы можем дополнительно улучшить программу, передав различные условия в поток filter
; Теперь программа может легко искать или находить файлы с заданным шаблоном в папке. Например:
Найти файлы с именем, начинающимся с «abc».
Список result; try (Stream walk = Files.walk (path)) {result = walk .filter (p ->! Files.isDirectory (p))//конвертируем путь в строку .map (p -> p.toString () ) .filter (f -> f.startsWith ("abc")) .collect (Collectors.toList ()); }
Найдите файлы с именем файла, содержащим слова «mkyong».
Список result; try (Stream walk = Files.walk (path)) {result = walk .filter (p ->! Files.isDirectory (p))//конвертируем путь в строку .map (p -> p.toString () ) .filter (f -> f.contains ("mkyong")) .collect (Collectors.toList ()); }
Загрузить исходный код
$ git clone https://github.com/mkyong/core -java
$ cd java-io
Ссылки
- FilenameFilter JavaDoc
- Files.walk JavaDoc
- Примеры Files.walk
- Как получить расширение файла в Java
- Как скопировать каталог в Java
Похожие статьи
- Примеры Java Files.find
- Примеры Java Files.walk
- Как удалить временный файл в Java
- Как записать данные во временный файл на Java
- Как записать файл UTF-8 на Java
- Как читать файл UTF-8 в Java
- Как преобразовать InputStream в файл в Java
- Как проверить, если файл существует в Java
- Как получить дату последнего изменения файла в Java
- Как получить текущий рабочий каталог в Java
mkyong
Основатель Mkyong.com, любит Java и вещи с открытым исходным кодом. Следуйте за ним в Twitter. Если вам нравятся мои уроки, сделайте пожертвование в эти благотворительные организации.
Есть ли ограничения на коллекторы. collect, поскольку он не показывает полный список файлов в каталоге из 40 файлов