[JAVA] IllegalArgumentException tritt in PathMatcher :: Matches auf

Veranstaltung

Plötzlich tut es mir aus persönlichen Gründen leid, aber wenn ich eine Reihe von Dateien und Verzeichnissen mit glob filtern möchte, habe ich "Files :: newDirectoryStream (Path, String)" verwendet. Vielmehr wusste ich nur, wie es geht.

In dieser API wird glob als zweites Argument angegeben. Das Folgende ist ein Beispiel.

var dir = Paths.get(".");
try (var paths = Files.newDirectoryStream(dir, "**.py")) {
    for (var path : paths) {
        doSomething(path);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Um ehrlich zu sein, ist "DirectoryStream" eine schwierig zu verwendende API, und ich persönlich finde es schwierig, eine Verbindung zu "java.util.Stream" herzustellen. __ Kurz gesagt: "Ich möchte die Filterung nach Glob in die Stream-Verarbeitung einbeziehen." __ Nachdem sich verschiedene Dinge untersucht hatten, stellte sich heraus, dass java.nio.file.PathMatcher verwendet werden sollte.

var dir = Paths.get(".");
var matcher = FileSystems.getDefault().getPathMatcher("**.py");
Files.walk(dir).filter(matcher::matches).forEach(path -> doSomething(path));

Als ich das sofort ausführte, bekam ich eine "IllegalArgumentException" wie unten gezeigt und es funktionierte nicht wie erwartet.


Exception in thread "main" java.lang.IllegalArgumentException
    at java.base/sun.nio.fs.WindowsFileSystem.getPathMatcher(WindowsFileSystem.java:262)
    at Main.main(Main.java:19)

Ursache und Abhilfe

Diesmal war es ein "Lass uns JavaDoc richtig lesen" -Projekt ... JavaDoc von FileSystem :: getPathMatcher (String) beschreibt Folgendes. Ich werde.

Der Parameter> syntaxAndPattern identifiziert die Syntax und das Muster und hat folgende Form:

syntax:pattern

Das ':' steht hier für sich. Die FileSystem-Implementierung unterstützt die Syntax "glob" und "regex", kann aber auch andere unterstützen. Die Werte der Syntaxkomponenten werden unabhängig vom Fall verglichen.

Wenn Sie das Glob-Muster wie dieses Mal verwenden möchten, müssen Sie es wie "glob: **. Py" schreiben. Hier ist eine Neufassung des obigen Beispiels, und wenn ich es ausführe, erhalte ich nicht mehr die "IllegalArgumentException".

var dir = Paths.get(".");
var matcher = FileSystems.getDefault().getPathMatcher("glob:**.py");
Files.walk(dir).filter(matcher::matches).forEach(path -> doSomething(path));

Recommended Posts

IllegalArgumentException tritt in PathMatcher :: Matches auf
[Java FX] IllegalArgumentException tritt in neuem Image (Pfad) auf
[SQLite] IllegalStateException, die im Cursor auftritt