How do I use directory globbing in JDK7

只谈情不闲聊 提交于 2019-11-29 16:39:24

问题


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


回答1:


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.




回答2:


You need to start your glob with **

matcher = FileSystems.getDefault().getPathMatcher("glob:**/foo/**/bar/*.dat");

Otherwise, calling

matcher.matches(file)

attempts to match the full path to the file against a regular expression that starts with the relative path (/foo/), rather than with the absolute path (d:/petermr-workspace/.../foo).

Prepending the ** to the glob just tells it to ignore the beginning of the absolute path.



来源:https://stackoverflow.com/questions/9148528/how-do-i-use-directory-globbing-in-jdk7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!