web-dev-qa-db-fra.com

Quand utiliser ** (double étoile) dans la syntaxe glob dans JAVA

Directement depuis this Java Tutoriel Oracle:

Deux astérisques, **, fonctionnent comme * mais franchissent les limites des répertoires. Cette syntaxe est généralement utilisée pour faire correspondre les chemins complets.

Quelqu'un pourrait-il en faire un vrai exemple? Que signifient-ils avec "traverse la limite du répertoire"? En franchissant la limite du répertoire, j'imagine quelque chose comme vérifier le fichier de la racine à getNameCount()-1. Encore une fois, un exemple réel expliquant la différence entre * et ** dans la pratique serait formidable.

48
Rollerball

Le javadoc pour FileSystem#getPathMatcher() a de très bons exemples et explications

*.Java Matches a path that represents a file name ending in .Java 
*.*    Matches file names containing a dot 

*.{Java,class}  Matches file names ending with .Java or .class 
foo.?           Matches file names starting with foo. and a single character extension 
/home/*/*       Matches /home/gus/data on UNIX platforms 
/home/**        Matches /home/gus and /home/gus/data on UNIX platforms 
C:\\*           Matches C:\foo and C:\bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:\\\\*")  

Alors /home/** correspondrait à /home/gus/data, mais /home/* non.

/home/* dit chaque fichier directement dans le /home répertoire.

/home/** dit que chaque fichier dans n'importe quel répertoire à l'intérieur /home.


Exemple de * contre **. En supposant que votre répertoire de travail actuel est /Users/username/workspace/myproject, alors ce qui suit ne correspondra qu'à ./myproject fichier (répertoire).

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*");
Files.walk(Paths.get(".")).forEach((path) -> {
    path = path.toAbsolutePath().normalize();
    System.out.print("Path: " + path + " ");
    if (pathMatcher.matches(path)) {
        System.out.print("matched");
    }
    System.out.println();
});

Si tu utilises **, il correspondra à tous les dossiers et fichiers de ce répertoire.

62