Это должно быть действительно просто. Если у меня есть такая строка:
../Test?/sample*.txt
тогда каков общепринятый способ получения списка файлов, соответствующих этому шаблону? (например , он должен соответствовать ../Test1/sample22b.txt
и , ../Test4/sample-spiffy.txt
но не ../Test3/sample2.blah
или ../Test44/sample2.txt
)
Я взглянул на него, org.apache.commons.io.filefilter.WildcardFileFilter
и это похоже на правильного зверя, но я не уверен, как использовать его для поиска файлов в относительном пути к каталогу.
Я полагаю, что могу найти источник для ant, так как он использует подстановочный синтаксис, но я должен упустить что-то довольно очевидное здесь.
( edit : приведенный выше пример был всего лишь примером. Я ищу способ разбирать общие пути, содержащие подстановочные знаки во время выполнения. Я выяснил, как это сделать, основываясь на предложении mmyers, но это немного раздражает. Не говоря уже о том, что JRE Java, кажется, автоматически разбирает простые подстановочные знаки в основном (аргументы String []) из одного аргумента, чтобы «сэкономить» мое время и хлопоты ... Я просто рад, что у меня не было файловых аргументов в смешивание.)
Ответы:
Рассмотрим DirectoryScanner от Apache Ant:
Вам понадобится ссылка на ant.jar (~ 1,3 МБ для муравья 1.7.1).
источник
DirectoryScanner
можно найти в сплетении утилит (241Kb). Что меньше, чемant.jar
(1,9 МБ).ls
с тем же шаблоном файла (миллисекунды используютls <pattern>
против минут при использовании DirectoryScanner) ...Попробуйте
FileUtils
из Apache commons-io (listFiles
иiterateFiles
методы):Чтобы решить вашу проблему с
TestX
папками, я сначала перебрал бы список папок:Довольно грубое решение, но оно должно работать нормально. Если это не соответствует вашим потребностям, вы всегда можете использовать RegexFileFilter .
источник
Вот примеры перечисления файлов по шаблону на основе Java 7 nio globbing и Java 8 lambdas:
или
источник
Files.walk(Paths.get("..")).filter(matcher::matches).forEach(System.out::println);
Вы можете преобразовать свою подстановочную строку в регулярное выражение и использовать его с
matches
методом String . Следуя вашему примеру:Это работает для ваших примеров:
И контрпримеры:
источник
?
public static boolean isFileMatchTargetFilePattern (конечный файл f, конечный String targetPattern) {`` String regex = targetPattern.replace (".", "\\."); `regex = regex.replace("?", ".?").replace("
*", ".
*");
return f.getName().matches(regex);
}
StringBuffer regexBuffer = ...; Matcher matcher = Pattern.compile("(.*?)([*?])").matcher(original); while (matcher.find()) { matcher.appendReplacement(regexBuffer, (Pattern.quote(matcher.group(1)) + (matcher.group(2).equals("*") ? ".*?" : ".?")).replace("\\", "\\\\").replace("$", "\\$")); } matcher.appendTail(regexBuffer);
.
вместо.?
.Начиная с Java 8 вы можете использовать
Files#find
метод непосредственно изjava.nio.file
.Пример использования
источник
Возможно, это не поможет вам прямо сейчас, но JDK 7 предназначен для соответствия имени файла glob и regex как части «Больше возможностей NIO».
источник
Библиотека подстановочных знаков эффективно выполняет сопоставление имен файлов как glob, так и regex:
http://code.google.com/p/wildcard/
Реализация краткая - JAR всего 12,9 килобайт.
источник
Простой способ без использования какого-либо внешнего импорта заключается в использовании этого метода
Я создал CSV-файлы, названные с помощью billing_201208.csv, billing_201209.csv, billing_201210.csv, и это выглядит нормально.
Вывод будет следующим, если файлы, перечисленные выше, существуют
источник
Как указано в другом ответе, библиотека подстановочных знаков работает как с глобальными, так и с регулярными выражениями: http://code.google.com/p/wildcard/
Я использовал следующий код для сопоставления шаблонов glob, включая абсолютные и относительные в файловых системах стиля * nix:
Я потратил некоторое время, пытаясь получить методы FileUtils.listFiles в библиотеке Apache commons io (см. Ответ Владимира), но безуспешно (сейчас я понимаю / думаю, что он может обрабатывать только шаблоны, соответствующие одному каталогу или файлу за раз) ,
Кроме того, использование фильтров регулярных выражений (см. Ответ Фабиана) для обработки произвольных предоставленных пользователем шаблонов глобуса абсолютного типа без поиска во всей файловой системе потребует некоторой предварительной обработки поставляемого глобуса для определения наибольшего префикса без регулярного выражения / глобуса.
Конечно, Java 7 может хорошо обрабатывать запрошенную функциональность, но, к сожалению, я пока застрял с Java 6. Библиотека относительно небольшая, ее размер составляет 13,5 КБ.
Примечание для рецензентов: я попытался добавить вышеприведенный ответ к существующему ответу с упоминанием этой библиотеки, но редактирование было отклонено. У меня недостаточно представителей, чтобы добавить это в качестве комментария. Нет ли лучшего способа ...
источник
Вы должны быть в состоянии использовать
WildcardFileFilter
. Просто используйте,System.getProperty("user.dir")
чтобы получить рабочий каталог. Попробуй это:Вам не нужно заменить
*
с[.*]
, предполагая подстановочное использование фильтраjava.regex.Pattern
. Я не проверял это, но я постоянно использую шаблоны и файловые фильтры.источник
Glob из Java7: Поиск файлов . ( Образец )
источник
Фильтр Apache создан для итерации файлов в известном каталоге. Чтобы разрешить использование подстановочных знаков в каталоге, необходимо разделить путь на '
\
' или '/
' и выполнить фильтр для каждой части отдельно.источник
Почему бы не использовать сделать что-то вроде:
Тогда вам не нужно будет беспокоиться об относительных путях, и вы сможете выполнять подстановочные знаки по мере необходимости.
источник
Реализуйте интерфейс JDK FileVisitor. Вот пример http://wilddiary.com/list-files-matching-a-naming-pattern-java/
источник
Метод использования:
Тест jUnit:
Вывод:
источник
foo/bar.txt
совпадает,foo?bar.txt
и это не правильно../Test?/sample*.txt
источник