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

2022-08-31 06:39:10

这应该非常简单。如果我有一个这样的字符串:

../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

Apache commons-io ( 和方法) 尝试 FileUtilslistFilesiterateFiles

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"));
   }
}

相当“蛮力”的解决方案,但应该可以正常工作。如果这不符合您的需求,您可以随时使用正则表达式文件过滤器


答案 2

考虑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)。