问题
这应该很简单。如果我有这样的字符串:
../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 赞)
TryFileUtils
fromApache commons-io(listFiles
anditerateFiles
methods):
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));
}