微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Java 中使用 glob 来匹配目录和子目录中的文件?

如何解决如何在 Java 中使用 glob 来匹配目录和子目录中的文件?

我有一种情况,我需要沿着特定路径匹配文件,并捕获该目录和任何子目录中匹配的所有文件。作为一项要求,我必须从基本根目录开始,并且该路径是不可变的。例如,假设我有 some/root/dir/foo/bar.javasome/root/dir/foo/baz/quux.java。如果我尝试运行以下代码,则不会得到我想要的结果:

private static void findMe(String srcPath,String matcherPattern) throws IOException {
  final List<Path> filePaths = new ArrayList<>();
  final PathMatcher matcher = FileSystems.getDefault().getPathMatcher(matcherPattern);
  Files.walkfiletree(srcPath,new SimpleFileVisitor<>() {
    @Override
    public FileVisitResult visitFile(Path file,BasicFileAttributes attrs) throws IOException {
      if (matcher.matches(file)) {
        filePaths.add(file);
      }
      return FileVisitResult.CONTINUE;
    }
  });
  filePaths.forEach(filePath -> System.out.println(filePath.toString()));
}

根据我的要求,我必须使用 "some/root" 作为 srcPath 参数的值。但是,如果我使用 findMe("some/root","glob:**/foo/*.java"),我只会得到我的第一个文件;如果我使用 findMe("some/root","glob:**/foo/**/*.java"),我只会得到我的第二个文件。我正在尝试做的事情是不是用 glob 是不可能的?如果我能以这种方式完成它,我很乐意用正则表达式替换 glob,但我也不确定如何构建该正则表达式。

解决方法

您的第一个 glob 与第二个文件不匹配,因为 **/foo 之间没有 .java 可以匹配潜在的子目录。

您的第二个 glob 与第一个文件不匹配,因为 /foo.java 之间有两个斜杠无法与 {{1} 根目录下的 .java 文件匹配}}

如果 /foo/ 目录始终位于您要搜索的目录的根目录,我建议使用 /foo/**.java,否则使用 foo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。