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
.
Теперь, когда мы обсудили реализацию поиска файлов на основе подстановочных знаков, давайте посмотрим на некоторый пример вывода. Мы будем использовать следующую файловую структуру для наших примеров:
Если мы передаем строку
с шаблоном «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 .