Перейти к основному содержимому

Найдите файлы, соответствующие строкам с подстановочными знаками в Java

· 4 мин. чтения

1. Обзор

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

2. Введение

В области программирования glob — это шаблон с подстановочными знаками для соответствия именам файлов . В нашем примере мы будем использовать шаблоны глобусов для фильтрации списка имен файлов. Мы будем использовать популярные подстановочные знаки «*» и «?». Java поддерживает эту функцию, начиная с Java SE 7.

Java предоставила метод getPathMatcher() в своем классе FileSystem . Он может принимать либо регулярное выражение (регулярное выражение), либо шаблон глобуса. В этом примере мы будем использовать шаблоны глобусов из-за простоты применения подстановочных знаков по сравнению с регулярными выражениями.

Давайте посмотрим на пример использования этого метода с шаблоном глобуса:

String pattern = "myCustomPattern";
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);

Вот несколько примеров шаблонов глобусов в Java:

   | Глоб    | Описание   | 
| *.Ява | Соответствует всем файлам с расширением «java» |
| *.{java,класс} | Соответствует всем файлам с расширениями «java» или «class». |
| *.* | Соответствует всем файлам с «.» где-то в его названии |
| ???? | Соответствует всем файлам с четырьмя символами в имени |
| [тест].docx | Соответствует всем файлам с именами файлов «t», «e», «s» или «t» и расширением «docx». |
| [0-4].csv | Соответствует всем файлам с именами файлов «0», «1», «2», «3» или «4» с расширением «csv». |
| С:\\темп\\* | Соответствует всем файлам в каталоге «C:\temp» в системах Windows. |
| источник/тест/* | Соответствует всем файлам в каталоге «src/test/» в системах на базе Unix. |

3. Реализация

Давайте углубимся в детали реализации этого решения. Есть два шага для выполнения этой задачи.

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

Во-вторых, мы используем метод walkFileTree из класса Files , предоставляемого Java, для вызова нашего процесса поиска.

Для начала давайте создадим наш класс SearchFileByWildcard с методом searchWithWc() , который принимает шаблон Path и String в качестве параметров:

class SearchFileByWildcard {
static List<String> matchesList = new ArrayList<String>();
List<String> searchWithWc(Path rootDir, String pattern) throws IOException {
matchesList.clear();
FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
FileSystem fs = FileSystems.getDefault();
PathMatcher matcher = fs.getPathMatcher(pattern);
Path name = file.getFileName();
if (matcher.matches(name)) {
matchesList.add(name.toString);
}
return FileVisitResult.CONTINUE;
}
};
Files.walkFileTree(rootDir, matcherVisitor);
return matchesList;
}
}

Для посещения файлов в rootDir мы используем интерфейс FileVisitor . Как только мы получим интерфейс к файловой системе, вызвав метод getDefault() , мы используем метод getPathMatcher() из класса FileSystem . Здесь мы применяем шаблоны глобусов к отдельным путям к файлам в корневом каталоге .

В нашем случае мы можем использовать получившийся PathMatcher для получения ArrayList совпадающих имен файлов.

Наконец, мы вызываем метод walkFileTree из класса NIO Files . Обход файла начинается с rootDir , и каждый узел в дереве посещается рекурсивно в глубину. matcherVisitor содержит реализацию метода visitFile из класса SimpleFileVisitor .

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

./dbac53e7106d12fa2bf912ae37e0de4a.jpg

Если мы передаем строку с шаблоном «glob:*.{txt,docx}» , наш код выводит три имени файла с расширением «txt» и одно имя файла с расширением «docx» :

SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}");

assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")),
new HashSet<>(actual));

Если мы передаем строку с шаблоном «glob:????.{csv}» , наш код выводит одно имя файла с четырьмя символами, за которым следует «.» с расширением «csv» :

SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}");

assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual));

4. Вывод

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

Исходный код доступен на GitHub .