webentwicklung-frage-antwort-db.com.de

Verwendung von ** (Doppelstern) in der Glob-Syntax innerhalb von JAVA

Direkt aus this Java Oracle Tutorial:

Zwei Sternchen ** funktionieren wie *, überschreiten jedoch die Verzeichnisgrenzen. Diese Syntax wird im Allgemeinen zum Abgleichen vollständiger Pfade verwendet.

Könnte jemand ein echtes Beispiel daraus machen? Was bedeuten sie mit "Verzeichnisgrenzen überschreiten"? Wenn ich die Verzeichnisgrenze überschreite, stelle ich mir vor, wie ich die Datei von root nach getNameCount()-1 überprüfe. Auch hier wäre ein reales Beispiel, das den Unterschied zwischen * und ** in der -Praxis erklärt, großartig.

48
Rollerball

Das Javadoc für FileSystem#getPathMatcher() enthält einige ziemlich gute Beispiele und Erklärungen

*.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:\\\\*")  

Also würde /home/** Mit /home/gus/data Übereinstimmen, aber /home/* Nicht.

/home/* Sagt jede Datei direkt im Verzeichnis /home.

/home/** Sagt jede Datei in einem beliebigen Verzeichnis in /home.


Beispiel für * Vs **. Angenommen, Ihr aktuelles Arbeitsverzeichnis ist /Users/username/workspace/myproject, Dann entspricht das Folgende nur der Datei ./myproject (Verzeichnis).

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

Wenn Sie ** Verwenden, werden alle Ordner und Dateien in diesem Verzeichnis abgeglichen.

62