Jak sprawdzić rozszerzenie ścieżki Java 7

84

Chciałbym sprawdzić, czy ścieżka (wprowadzona w Javie 7) kończy się pewnym rozszerzeniem. Spróbowałem takiej endsWith()metody:

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

Jednak to nie działa, ponieważ path.endsWith(".java")zwraca false. Wygląda na to, że endsWith()metoda zwraca prawdę tylko wtedy, gdy istnieje pełne dopasowanie do wszystkiego po końcowym separatorze katalogu (np. bar.java), Co nie jest dla mnie praktyczne.

Jak więc mogę sprawdzić rozszerzenie pliku ścieżki?

Thunderforge
źródło
1
@assylias, to pytanie dotyczy znalezienia rozszerzenia z a String, a nie a Path(chociaż zadziałałoby Path.toString(), ale liczyłem na sposób, który by tego nie wymagał).
Thunderforge,
Pojęcie rozszerzenia pliku jest zależne od systemu operacyjnego, więc nie sądzę, aby było obsługiwane w pliku lub ścieżce.
assylias
@assylias: Cóż, to jest do bani. Pojęcie rozszerzenia pliku jest dobrze zdefiniowane i używane wielokrotnie w systemach Windows / Linux / MacOs / Android. Mimo że mogą być mniej ważne w systemie Linux niż w systemie Windows, nadal są bardzo często używane w aplikacjach komputerowych i serwerowych.
Eric Duminil

Odpowiedzi:

84

PathMatcher Java NIO zapewnia FileSystem.getPathMatcher (składnia ciągu znakówAndPattern) :

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

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

Szczegółowe informacje można znaleźć w samouczku Znajdowanie plików .

wentylator
źródło
14
Myślę, że w tym miejscu brakuje gwiazdki, dla mnie działa:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
Josh
22
A jeśli przeglądasz różne katalogi, musisz użyć „glob: **. Java”
LaGrandMere
1
Dla mnie komentarz LaGrandMere załatwił sprawę. Gdyby @Dave Jarvis mógł połączyć swoje rady z wybraną odpowiedzią, myślę, że pomogłoby to początkującym w NIO-API. Pod Windoze: Jeśli chcę użyć glob:*.java, filenamenie powinno zawierać żadnej ścieżki nadrzędnej. Jeśli używam ścieżki rel / abs glob:c:/users/muchwow/*.java, to działa (zauważ, że \\\\ musi być używany z ukośnikami odwrotnymi). Wzorzec glob:**.javawyszukuje po prostu wszystko, co zawiera * .java, niezależnie od ścieżki nadrzędnej.
JackLeEmmerdeur
67

PathKlasa nie mają pojęcia „rozszerzenie”, prawdopodobnie dlatego, że sam system plików nie ma. Dlatego musisz sprawdzić jego Stringreprezentację i zobaczyć, czy kończy się czterema pięcioznakowymi ciągami .java. Pamiętaj, że potrzebujesz innego porównania niż proste, endsWithjeśli chcesz uwzględnić mieszane przypadki, takie jak ".JAVA"i ".Java":

path.toString().toLowerCase().endsWith(".java");
Nędzna zmienna
źródło
To nie jest dobre rozwiązanie ze względu na możliwy NullPointer. Lepiej jest użyć jakiejś biblioteki (np. Narzędzia Apache IO) lub PathMatchera, jak wspomniano powyżej.
KHanusova
15

Proste rozwiązanie:

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

Podczas korzystania z metody Path.endsWith należy zachować ostrożność. Jak już powiedziałeś, metoda zwróci wartość true tylko wtedy, gdy będzie pasować do elementu podrzędnego obiektu Path. Na przykład:

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
Pero122
źródło
3

Nie ma możliwości zrobienia tego bezpośrednio na samym obiekcie Path.

Widzę dwie opcje:

  1. Konwertuj ścieżkę na plik i wywołanie endWith w ciągu zwróconym przez File.getName ()
  2. Wywołaj toString w Path i wywołanie endWith w tym String.
znak
źródło