如何在JDK7中使用目录通配符

我一直在尝试使用JDK7中的新globbingfunction,从文档和示例开始

我可以使用诸如"glob:*.dat"这样的"glob:*.dat"来处理

 Files.walkFileTree(startingDir, finder); 

例子,但我无法使"**"语法工作。 我希望能够创建类似的东西:

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

并希望得到一个简单的例子。 我使用的是Windows 7。

更新:@Oleg和@JBNizet清楚地表明“/”语法与操作系统无关。 请注意, Javadocs建议也可以使用依赖于操作系统的语法(需要)

仍有问题:已采取@Nizet并编辑如下:

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

这给出了如下输出:

 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 

但没有匹配的证据

这是一个工作示例,显示d:/任何后代目录中的所有zip文件:

 public static void main(String[] args) throws IOException { final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip"); Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor() { @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; } }); } 

如您所见,使用正斜杠适用于Windows。

你需要用**开始你的全局

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

否则,打电话

 matcher.matches(file) 

尝试将文件的完整路径与以相对路径(/ foo /)开头的正则表达式匹配,而不是与绝对路径(d:/ petermr-workspace /…/ foo)匹配。

将**添加到glob只是告诉它忽略绝对路径的开头。

    Interesting Posts