Du coup, je suis désolé pour des raisons personnelles, mais quand je veux filtrer une série de fichiers et de répertoires en utilisant glob, j'ai utilisé Files :: newDirectoryStream (Path, String)
. Au contraire, je savais seulement comment le faire.
Dans cette API, glob est spécifié comme deuxième argument. Ce qui suit est un exemple.
var dir = Paths.get(".");
try (var paths = Files.newDirectoryStream(dir, "**.py")) {
for (var path : paths) {
doSomething(path);
}
} catch (IOException e) {
e.printStackTrace();
}
Pour être honnête, DirectoryStream
est une API difficile à utiliser, et je trouve personnellement difficile de me connecter à java.util.Stream
. __ En bref, "Je veux incorporer le filtrage par glob dans le traitement Stream." __ Ensuite, après avoir étudié diverses choses, il s'est avéré que java.nio.file.PathMatcher
devrait être utilisé.
var dir = Paths.get(".");
var matcher = FileSystems.getDefault().getPathMatcher("**.py");
Files.walk(dir).filter(matcher::matches).forEach(path -> doSomething(path));
Quand j'ai exécuté ceci immédiatement, j'ai eu le ʻIllegalArgumentException` suivant et cela n'a pas fonctionné comme prévu.
Exception in thread "main" java.lang.IllegalArgumentException
at java.base/sun.nio.fs.WindowsFileSystem.getPathMatcher(WindowsFileSystem.java:262)
at Main.main(Main.java:19)
Cette fois, c'était un projet "Lisons JavaDoc correctement" ... JavaDoc of FileSystem :: getPathMatcher (String)
décrit comme suit. Je vais.
Le paramètre> syntaxAndPattern identifie la syntaxe et le modèle et prend la forme:
syntax:pattern
Le «:» se présente ici pour lui-même. L'implémentation FileSystem supporte les syntaxes "glob" et "regex", mais peut également en supporter d'autres. Les valeurs des composants syntaxiques sont comparées indépendamment de la casse.
Si vous voulez utiliser le modèle glob comme cette fois, vous devez l'écrire comme glob: **. Py
. Voici une réécriture de l'exemple ci-dessus en l'utilisant, et quand je l'exécute, je n'obtiens plus l'exception ʻIllegalArgumentException`.
var dir = Paths.get(".");
var matcher = FileSystems.getDefault().getPathMatcher("glob:**.py");
Files.walk(dir).filter(matcher::matches).forEach(path -> doSomething(path));