Как проверить расширение пути Java 7


84

Я хотел бы проверить, заканчивается ли путь (представленный в Java 7) определенным расширением. Я пробовал endsWith()метод так:

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}

Однако это не работает, потому что path.endsWith(".java")возвращает false. Кажется, что endsWith()метод возвращает true только в том случае, если есть полное совпадение для всего, что находится после последнего разделителя каталогов (например bar.java), что для меня нецелесообразно.

Итак, как я могу проверить расширение файла пути?



1
@assylias, этот вопрос касается поиска расширения от a String, а не от Path(хотя он работал бы Path.toString(), но я надеялся на способ, который этого не требует).
Thunderforge

Понятие расширения файла зависит от операционной системы, поэтому я не думаю, что оно поддерживается в File или Path.
assylias

@assylias: Это отстой. Понятие расширения файла четко определено и много раз используется в Windows / Linux / MacOs / Android. Хотя они могут быть менее важными в Linux, чем в Windows, они все еще очень широко используются в настольных и серверных приложениях.
Eric

Ответы:


84

PathMatcher Java NIO предоставляет FileSystem.getPathMatcher (String syntaxAndPattern) :

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}

См. Подробности в руководстве по поиску файлов .


14
Я думаю, что здесь отсутствует звездочка, у меня работает следующее:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
Джош

22
И если вы просматриваете разные каталоги, вам нужно использовать "glob: **. Java"
LaGrandMere

1
Для меня комментарий Лаграндмера помог. Если бы @Dave Jarvis мог объединить свой совет с выбранным ответом, я думаю, это помогло бы новичкам в NIO-API. В Windoze: если я хочу использовать glob:*.java, то filenameне должен содержать родительский путь. Если я использую путь rel / abs, например glob:c:/users/muchwow/*.java, он работает (обратите внимание, что \\\\ должен использоваться с обратной косой чертой). Шаблон glob:**.javaпросто ищет все, что содержит * .java, независимо от родительского пути.
JackLeEmmerdeur

67

У Pathкласса нет понятия «расширение», вероятно, потому, что оно отсутствует в самой файловой системе. Вот почему вам нужно проверить его Stringпредставление и посмотреть, заканчивается ли оно строкой из четырех пяти символов .java. Обратите внимание, что вам нужно другое сравнение, чем простое, endsWithесли вы хотите охватить смешанный регистр, например ".JAVA"и ".Java":

path.toString().toLowerCase().endsWith(".java");

Это не лучшее решение из-за возможного NullPointer. Лучше использовать какую-нибудь библиотеку (например, утилиты apache IO) или PathMatcher, как упоминалось выше.
Ханусова

15

Простое решение:

if( path.toString().endsWith(".java") ) //Do something

Вы должны быть осторожны при использовании метода Path.endsWith. Как вы заявили, метод вернет true, только если он совпадает с подэлементом вашего объекта Path. Например:

Path p = Paths.get("C:/Users/Public/Mycode/HelloWorld.java");
System.out.println(p.endsWith(".java")); // false
System.out.println(p.endsWith("HelloWorld.java")); // true

3

Невозможно сделать это непосредственно на самом объекте Path.

Я вижу два варианта:

  1. Преобразуйте путь к файлу и вызовите endWith для строки, возвращаемой File.getName ()
  2. Вызов toString на пути и вызов endWith для этой строки.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.