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)
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));