Как найти файлы с расширением файла в Java

Автор mkyong |
Просмотров: 97 302 | +82 pv/w
Next>

В этой статье показано, как 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)) {//...}  

Темы

  1. Найти файлы с указанным расширением (Files.walk)
  2. Найти файлы с кратными расширениями (Files.walk)

1. Поиск файлов с указанным расширением

В этом примере выполняется поиск файлов, соответствующих расширению png . Находки начинаются с папки верхнего уровня C: \ test и включают все уровни вложенных папок.

FindFileByExtension1.java
  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 ).

FindFileByExtension2.java
  пакет 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
Теги: расширение файла, дерево файлов, Files.walk, найти файл java 8 stream java.io java.nio
Далее>

Похожие статьи

  • Примеры Java Files.find
  • Примеры Java Files.walk
  • Как удалить временный файл в Java
  • Как записать данные во временный файл на Java
  • Как записать файл UTF-8 на Java
  • Как читать файл UTF-8 в Java
  • Как преобразовать InputStream в файл в Java
  • Как проверить, если файл существует в Java
  • Как получить дату последнего изменения файла в Java
  • Как получить текущий рабочий каталог в Java

mkyong

Основатель Mkyong.com, любит Java и вещи с открытым исходным кодом. Следуйте за ним в Twitter. Если вам нравятся мои уроки, сделайте пожертвование в эти благотворительные организации.

1 комментарий
Самые популярные
Новые самые старые
Встроенные отзывы
Просмотреть все комментарии
Рави
20 дней назад

Есть ли ограничения на коллекторы. collect, поскольку он не показывает полный список файлов в каталоге из 40 файлов

0
Ответить
Оцените статью
futurei.ru
Добавить комментарий