Рубрики
Без рубрики

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

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

Автор оригинала: mkyong.

В этой статье показано, как использовать Java 8 Файлы.прогулка для обхода дерева файлов и потоковой операции фильтр для поиска файлов, соответствующих определенному расширению файла, из папки и ее вложенных папок.

  // find files matched `png` file extension from folder C:\\test
  try (Stream walk = Files.walk(Paths.get("C:\\test"))) {
      result = walk
              .filter(p -> !Files.isDirectory(p))   // not a directory
              .map(p -> p.toString().toLowerCase()) // convert path to string
              .filter(f -> f.endsWith("png"))       // check end with
              .collect(Collectors.toList());        // collect all matched to a List
  }

В поле .метод walk , второй аргумент, максимальная глубина определяет максимальное количество уровней каталогов для посещения. И мы можем назначить максимальную глубину для поиска файлов только из папки верхнего уровня (исключить все ее подпапки)

  try (Stream walk = Files.walk(Paths.get("C:\\test"), 1)) {
      //...
  }

Темы

  1. Поиск файлов с указанным расширением (Files.walk)
  2. Поиск файлов с несколькими расширениями файлов (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;

public class FindFileByExtension1 {

    public static void main(String[] args) {

        try {

            List files = findFiles(Paths.get("C:\\test"), "png");
            files.forEach(x -> System.out.println(x));

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static List findFiles(Path path, String fileExtension)
        throws IOException {

        if (!Files.isDirectory(path)) {
            throw new IllegalArgumentException("Path must be a directory!");
        }

        List result;

        try (Stream walk = Files.walk(path)) {
            result = walk
                    .filter(p -> !Files.isDirectory(p))
                    // this is a path, not string,
                    // this only test if path end with a certain path
                    //.filter(p -> p.endsWith(fileExtension))
                    // convert path to string first
                    .map(p -> p.toString().toLowerCase())
                    .filter(f -> f.endsWith(fileExtension))
                    .collect(Collectors.toList());
        }

        return result;
    }

}

Выход

c:\test\bk\logo-new.png
c:\test\bk\resize-default.png
c:\test\google.png
c:\test\test1\test2\java.png
...

2. Поиск файлов с несколькими расширениями файлов

В этом примере найдены файлы, соответствующие нескольким расширениями файлов ( .png , .jpg , .gif ).

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;

public class FindFileByExtension2 {

    public static void main(String[] args) {

        try {

            String[] extensions = {"png", "jpg", "gif"};
            List files = findFiles(Paths.get("C:\\test"), extensions);
            files.forEach(x -> System.out.println(x));

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static List findFiles(Path path, String[] fileExtensions) throws IOException {

        if (!Files.isDirectory(path)) {
            throw new IllegalArgumentException("Path must be a directory!");
        }

        List result;
        try (Stream walk = Files.walk(path, 1)) {
            result = walk
                    .filter(p -> !Files.isDirectory(p))
                    // convert path to string
                    .map(p -> p.toString().toLowerCase())
                    .filter(f -> isEndWith(f, fileExtensions))
                    .collect(Collectors.toList());
        }
        return result;

    }

    private static boolean isEndWith(String file, String[] fileExtensions) {
        boolean result = false;
        for (String fileExtension : fileExtensions) {
            if (file.endsWith(fileExtension)) {
                result = true;
                break;
            }
        }
        return result;
    }

}

Выход

c:\test\bk\logo-new.png
c:\test\bk\resize-default.gif
c:\test\bk\resize-fast.gif
c:\test\bk\resize.png
c:\test\google.jpg
c:\test\google.png
c:\test\test1\test2\java.png
c:\test\test1\test2\java.jpg

2.2 Метод сэндвич() может быть короче с потоком Java 8 Любое совпадение .

private static boolean isEndWith(String file, String[] fileExtensions) {

    // Java 8, try this
    boolean result = Arrays.stream(fileExtensions).anyMatch(file::endsWith);
    return result;

    // old school style
    /*boolean result = false;
    for (String fileExtension : fileExtensions) {
        if (file.endsWith(fileExtension)) {
            result = true;
            break;
        }
    }
    return result;*/
}

2.3 Мы также можем удалить метод сэндвич() и поместить любое совпадение непосредственно в фильтр .

  public static List findFiles(Path path, String[] fileExtensions)
      throws IOException {

      if (!Files.isDirectory(path)) {
          throw new IllegalArgumentException("Path must be a directory!");
      }

      List result;
      try (Stream walk = Files.walk(path, 1)) {
          result = walk
                  .filter(p -> !Files.isDirectory(p))
                  // convert path to string
                  .map(p -> p.toString().toLowerCase())
                  //.filter(f -> isEndWith(f, fileExtensions))

                  // lambda
                  //.filter(f -> Arrays.stream(fileExtensions).anyMatch(ext -> f.endsWith(ext)))

                  // method reference
                  .filter(f -> Arrays.stream(fileExtensions).anyMatch(f::endsWith))     
                  .collect(Collectors.toList());
      }
      return result;

  }

2.4 Мы можем еще больше улучшить программу, передав различные условия в поток фильтр ; Теперь программа может легко искать или находить файлы с указанным шаблоном из папки. Для примеров:

Найдите файлы с именем, начинающимся с “abc”.

  List result;
  try (Stream walk = Files.walk(path)) {
      result = walk
              .filter(p -> !Files.isDirectory(p))
              // convert path to string
              .map(p -> p.toString())
              .filter(f -> f.startsWith("abc"))
              .collect(Collectors.toList());
  }

Найдите файлы с именем, содержащим слова “mkyong”.

  List result;
  try (Stream walk = Files.walk(path)) {
      result = walk
              .filter(p -> !Files.isDirectory(p))
              // convert path to string
              .map(p -> p.toString())
              .filter(f -> f.contains("mkyong"))
              .collect(Collectors.toList());
  }

Скачать Исходный Код

$клон git $клон git

$cd java-ввод-вывод

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-find-files-with-certain-extension-only/”