web-dev-qa-db-ja.com

JAVA内のglob構文で**(二重星)を使用する場合

this Java Oracleチュートリアルから直接:

2つのアスタリスク**は*と同じように機能しますが、ディレクトリの境界を越えます。この構文は通常、完全なパスの照合に使用されます。

誰かがそれから実際の例を行うことができますか? 「ディレクトリの境界を越える」とはどういう意味ですか?ディレクトリの境界を越えて、ルートからgetNameCount()-1までファイルをチェックするようなものを想像します。再びpracticeの*と**の違いを説明する実際の例は素晴らしいでしょう。

48
Rollerball

FileSystem#getPathMatcher() のjavadocには、かなり良い例と説明があります

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

したがって、/home/**/home/gus/dataと一致しますが、/home/*は一致しません。

/home/*は、/homeディレクトリ内のすべてのファイルを直接言っています。

/home/**は、/home内の任意のディレクトリにあるすべてのファイルを言っています。


***の例。現在の作業ディレクトリが/Users/username/workspace/myprojectであると仮定すると、以下は./myprojectファイル(ディレクトリ)とのみ一致します。

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

**を使用すると、そのディレクトリ内のすべてのフォルダーとファイルが一致します。

62