[JAVA] IllegalArgumentException se produit dans PathMatcher :: matches

un événement

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)

Cause et remède

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

Recommended Posts

IllegalArgumentException se produit dans PathMatcher :: matches
[Java FX] IllegalArgumentException se produit dans une nouvelle image (chemin)
[SQLite] IllegalStateException qui se produit dans Cursor