如何在Java中查找与通配符字符串匹配的文件?

问题

这应该很简单。如果我有这样的字符串:

../Test?/sample*.txt

那么获得与此模式匹配的文件列表的普遍接受的方法是什么? (例如,它应匹配../Test1/sample22b.txt../Test4/sample-spiffy.txt但不是../Test3/sample2.blah../Test44/sample2.txt)

我已经看了org.apache.commons.io.filefilter.WildcardFileFilter,看起来像是正确的野兽,但我不知道如何使用它来查找相对目录路径中的文件。

我想我可以查看ant的源代码,因为它使用了通配符语法,但我必须在这里遗漏一些非常明显的东西。

(编辑:上面的例子只是一个示例案例。我正在寻找在运行时解析包含通配符的常规路径的方法。我想出了如何根据mmyers的建议来做这件事,但这有点烦人。不要提到java JRE似乎从一个参数自动解析main(String []参数)中的简单通配符,以"节省"我的时间和麻烦......我很高兴我没有非文件参数在混合中。)


#1 热门回答(106 赞)

TryFileUtilsfromApache commons-io(listFilesanditerateFilesmethods):

File dir = new File(".");
FileFilter fileFilter = new WildcardFileFilter("sample*.java");
File[] files = dir.listFiles(fileFilter);
for (int i = 0; i < files.length; i++) {
   System.out.println(files[i]);
}

要使用TestX文件夹解决你的问题,我将首先遍历文件夹列表:

File[] dirs = new File(".").listFiles(new WildcardFileFilter("Test*.java");
for (int i=0; i<dirs.length; i++) {
   File dir = dirs[i];
   if (dir.isDirectory()) {
       File[] files = dir.listFiles(new WildcardFileFilter("sample*.java"));
   }
}

相当"蛮力"的解决方案,但应该工作正常。如果这不符合你的需求,你可以随时使用RegexFileFilter


#2 热门回答(68 赞)

考虑来自Apache Ant的DirectoryScanner:

DirectoryScanner scanner = new DirectoryScanner();
scanner.setIncludes(new String[]{"**/*.java"});
scanner.setBasedir("C:/Temp");
scanner.setCaseSensitive(false);
scanner.scan();
String[] files = scanner.getIncludedFiles();

你需要引用ant.jar(对于ant 1.7.1,大约1.3 MB)。


#3 热门回答(36 赞)

以下是按模式驱动的列表文件的示例:由Java 7 nioglobbing和Java 8 lambdas提供:

try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(
            Paths.get(".."), "Test?/sample*.txt")) {
        dirStream.forEach(path -> System.out.println(path));
    }

要么

PathMatcher pathMatcher = FileSystems.getDefault()
        .getPathMatcher("regex:Test.[\\/]sample\\w+\\.txt");
    try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(
            new File("..").toPath(), pathMatcher::matches)) {
        dirStream.forEach(path -> System.out.println(path));
    }