Як перевірити розширення шляху Java 7


84

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

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

Однак це, здається, не працює, оскільки path.endsWith(".java")повертає false. Здається, endsWith()метод повертає істину лише тоді, коли після остаточного роздільника каталогів (наприклад bar.java) існує повне збіг для всього , що для мене не практично.

То як я можу перевірити розширення файлу Шляху?



1
@assylias, це питання полягає у пошуку розширення з а String, а не з Path(хоча це спрацювало б Path.toString(), але я сподівався на спосіб, який цього не вимагав би).
Thunderforge

Поняття розширення файлу залежить від ОС, тому я не думаю, що його підтримують у File або Path.
assylias

@assylias: Ну, це відмовно. Поняття розширення файлу є чітко визначеним і багато разів використовується в Windows / Linux / MacOs / Android. Незважаючи на те, що вони можуть бути менш важливими в Linux, ніж у Windows, вони все ще дуже часто використовуються в настільних та серверних додатках.
Ерік Думініл

Відповіді:


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
Для мене коментар LaGrandMere зробив свою справу. Якби @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. Перетворити Шлях у Файл і виклик закінчуєтьсяWith у рядку, що повертається File.getName ()
  2. Виклик toString на Шляху і виклик закінчується на цьому рядку.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.