So überprüfen Sie die Erweiterung eines Java 7-Pfads

84

Ich möchte überprüfen, ob ein Pfad (eingeführt in Java 7) mit einer bestimmten Erweiterung endet. Ich habe die endsWith()Methode so ausprobiert :

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

Dies scheint jedoch nicht zu funktionieren, da path.endsWith(".java")false zurückgegeben wird. Es scheint, dass die endsWith()Methode nur dann true zurückgibt, wenn nach dem endgültigen Verzeichnis-Trennzeichen (z. B. bar.java) für alles eine vollständige Übereinstimmung vorliegt , was für mich nicht praktikabel ist.

Wie kann ich die Dateierweiterung eines Pfads überprüfen?

Donnerschmiede
quelle
1
@assylias, diese Frage dient dazu, die Erweiterung von a zu finden String, nicht von a Path(obwohl es funktionieren würde Path.toString(), aber ich hatte auf einen Weg gehofft, der das nicht erfordert).
Thunderforge
Der Begriff der Dateierweiterung ist os-abhängig, daher glaube ich nicht, dass er in Datei oder Pfad unterstützt wird.
Assylias
@assylias: Nun, das ist scheiße. Der Begriff der Dateierweiterung ist klar definiert und wird in Windows / Linux / MacOs / Android häufig verwendet. Obwohl sie unter Linux möglicherweise weniger wichtig sind als unter Windows, werden sie in Desktop- und Serveranwendungen immer noch sehr häufig verwendet.
Eric Duminil

Antworten:

83

Der PathMatcher von Java NIO bietet FileSystem.getPathMatcher (String syntaxAndPattern) :

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

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

Siehe die Informationen finden Sie im Lernprogramm zum Suchen von Dateien .

Ventilator
quelle
14
Ich denke, dies fehlt ein Sternchen, das folgende funktioniert für mich:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
Josh
22
Und wenn Sie durch verschiedene Verzeichnisse schauen, müssen Sie "glob: **. Java"
LaGrandMere
1
Für mich hat der Kommentar von LaGrandMere den Trick getan. Wenn @ Dave Jarvis seinen Rat in die gewählte Antwort einfließen lassen könnte, würde dies wahrscheinlich Anfängern in der NIO-API helfen. Unter Windoze: Wenn ich verwenden möchte glob:*.java, filenamesollte es keinen übergeordneten Pfad enthalten. Wenn ich einen rel / abs-Pfad wie verwende glob:c:/users/muchwow/*.java, funktioniert dies (beachten Sie, dass \\\\ mit Backslashes verwendet werden muss). Das Muster glob:**.javasucht nur nach allem, was * .java enthält, unabhängig vom übergeordneten Pfad.
JackLeEmmerdeur
67

Die PathKlasse hat keinen Begriff von "Erweiterung", wahrscheinlich weil das Dateisystem selbst ihn nicht hat. Aus diesem Grund müssen Sie die StringDarstellung überprüfen und feststellen, ob sie mit den vier fünf Zeichen endet .java. Beachten Sie, dass Sie einen anderen Vergleich als einfach benötigen, endsWithwenn Sie gemischte Fälle wie ".JAVA"und abdecken möchten ".Java":

path.toString().toLowerCase().endsWith(".java");
Elende Variable
quelle
Dies ist wegen des möglichen NullPointer keine gute Lösung. Es ist besser, eine Bibliothek (z. B. Apache IO-Utils) oder PathMatcher wie oben erwähnt zu verwenden.
KHanusova
15

Einfache Lösung:

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

Bei der Verwendung der Path.endsWith-Methode müssen Sie vorsichtig sein. Wie Sie angegeben haben, gibt die Methode nur dann true zurück , wenn sie mit einem Unterelement Ihres Path-Objekts übereinstimmt. Zum Beispiel:

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
quelle
3

Es gibt keine Möglichkeit, dies direkt auf dem Path-Objekt selbst zu tun.

Ich kann zwei Optionen sehen:

  1. Konvertieren Sie den Pfad in eine Datei und rufen Sie endenWith für den von File.getName () zurückgegebenen String auf.
  2. Rufen Sie toString auf dem Pfad auf und callendsWith für diesen String.
Kennzeichen
quelle