Описание реализации интерфейса FilenameFilter в Java, и выборка файлов при помощи метода listFiles() из класса File.
При использование метода listFiles() из класса File, можно дополнительно воспользоваться и реализовать интерфейс для FilenameFilter для фильтрации и выборки только необходимых файлов, например по типу расширения.
Java FilenameFilter
Интерфейс FilenameFilter содержит метод boolean accept(File dir, String name), который необходимо переопределить в реализации. При обработки списка файлов, этот метод будет применён к каждому файлу.
Например можно реализовать проверку всех файлов содержащихся в папке и отобразить только те которые имеют нужное расширение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package tech.elekt; import java.io.File; public class FileNameFilterExample { public static void main(String[] args) { String dir = "tmp"; String ext = ".doc"; findFiles(dir, ext); } private static void findFiles(String dir, String ext) { File file = new File(dir); if (!file.exists()) { System.out.println(dir + " Директория не существует!"); } File[] listFiles = file.listFiles(new CustomFileNameFilter(ext)); // Пример c использованиеv lambda //File[] listFiles = file.listFiles((d, s) -> { // return s.toLowerCase().endsWith(ext); //}); if (listFiles.length == 0) { System.out.println(dir + " директория не содержит файлов!"); } else { for (File f : listFiles) { System.out.println("Файл: " + dir + File.separator + f.getName()); } } } } |
Результат выполнения:
1 2 |
Файл: tmp\file_2.doc Файл: tmp\file_3.doc |
Использование lambda и FilenameFilter
По скольку FileNameFilter является функциональным интерфейсом начиная с Java 8, мы можем уменьшить колличество кода используя lambda:
1 2 3 4 |
Файл: tmp\file_2.doc File[] listFiles = file.listFiles((d, s) -> { return s.toLowerCase().endsWith(ext); }); |