How do I use directory globbing in JDK7

glob, java, java-7, java.nio.file

Solution

Here's a working example which displays all the zip files in any descendant directory of `d:/`:

public static void main(String[] args) throws IOException {
    final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip");
    Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            if (matcher.matches(file)) {
                System.out.println(file);
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    });
}

As you see, using forward slashes works on Windows.

Problem

I have been trying to use the new globbing feature in JDK7, starting from the documentation and examples I can get globs such as `"glob:*.dat"` to work with the ``` Files.walkFileTree(startingDir, finder); ``` example but I have been unable to get the `"**"` syntax working. I would like to be able to create something like: ``` matcher = FileSystems.getDefault().getPathMatcher("glob:" + "foo/**/bar/*.dat"); ``` and would be grateful for a simple example. I am using Windows 7. UPDATE: @Oleg and @JBNizet make it clear that the "/" syntax is OS-independent. Note that the Javadocs suggest that OS-dependent syntax is also possible (?required) STILL PROBLEMS: Have taken @Nizet and edited as follows: ``` @Test public void testStackoverflowGlobber() throws IOException { final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.cml"); Files.walkFileTree(Paths.get("d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources"), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println("try>> "+file); if (matcher.matches(file)) { System.out.println("MATCHES>>"+file); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } }); } ``` and this gives output such as: ``` try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdx try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdxml try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cml try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cdxml try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cml try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cif\aa2004.cml ``` but no evidence of matching

Original source