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?
String
, a nie aPath
(chociaż zadziałałobyPath.toString()
, ale liczyłem na sposób, który by tego nie wymagał).Odpowiedzi:
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 .
źródło
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
glob:*.java
,filename
nie powinno zawierać żadnej ścieżki nadrzędnej. Jeśli używam ścieżki rel / absglob:c:/users/muchwow/*.java
, to działa (zauważ, że \\\\ musi być używany z ukośnikami odwrotnymi). Wzorzecglob:**.java
wyszukuje po prostu wszystko, co zawiera * .java, niezależnie od ścieżki nadrzędnej.Path
Klasa nie mają pojęcia „rozszerzenie”, prawdopodobnie dlatego, że sam system plików nie ma. Dlatego musisz sprawdzić jegoString
reprezentację i zobaczyć, czy kończy sięczteremapięcioznakowymi ciągami.java
. Pamiętaj, że potrzebujesz innego porównania niż proste,endsWith
jeśli chcesz uwzględnić mieszane przypadki, takie jak".JAVA"
i".Java"
:path.toString().toLowerCase().endsWith(".java");
źródło
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
źródło
Nie ma możliwości zrobienia tego bezpośrednio na samym obiekcie Path.
Widzę dwie opcje:
źródło