64

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

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

誰かがそれから実際の例を作ることができますか? 「ディレクトリ境界を越える」とはどういう意味ですか? ディレクトリの境界を越えて、ルートからgetNameCount()-1. 繰り返しますが、実際の * と ** の違いを説明する実際の例は素晴らしいでしょう。

4

2 に答える 2

70

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

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

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

于 2013-09-10T15:09:08.890 に答える