猿问

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

如何在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似乎自动解析主参数(字符串[]参数)中的简单通配符,以“节省”我的时间和麻烦.我只是很高兴我没有在混合中有非文件的争论。)


忽然笑
浏览 2023回答 3
3回答

哆啦的时光机

考虑ApacheAnt中的DirectoryScaner:DirectoryScanner scanner = new DirectoryScanner();scanner.setIncludes(new String[]{"**/*.java"}); scanner.setBasedir("C:/Temp");scanner.setCaseSensitive(false);scanner.scan();String[] files = scanner.getIncludedFiles();您需要引用ant.jar(蚂蚁1.7.1的~1.3MB)。

隔江千里

试一试FileUtils从…Apache Commons-io&nbsp;(listFiles和iterateFiles方法):File&nbsp;dir&nbsp;=&nbsp;new&nbsp;File(".");FileFilter&nbsp;fileFilter&nbsp;=&nbsp;new&nbsp;WildcardFileFilter("sample*.java"); File[]&nbsp;files&nbsp;=&nbsp;dir.listFiles(fileFilter);for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;files.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;System.out.println(files[i]);}来解决您的问题。TestX文件夹,我将首先遍历文件夹列表:File[]&nbsp;dirs&nbsp;=&nbsp;new&nbsp;File(".").listFiles(new&nbsp;WildcardFileFilter("Test*.java");for&nbsp;(int&nbsp;i=0;&nbsp;i<dirs.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;File&nbsp;dir&nbsp;=&nbsp;dirs[i]; &nbsp;&nbsp;&nbsp;if&nbsp;(dir.isDirectory())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;files&nbsp;=&nbsp;dir.listFiles(new&nbsp;WildcardFileFilter("sample*.java")); &nbsp;&nbsp;&nbsp;}}相当“蛮力”的解决方案,但应该工作得很好。如果这不符合您的需要,则可以始终使用RegexFileFilter.

Smart猫小萌

下面是按模式列出文件的示例Java 7 Nio&nbsp;球状和Java 8 Lambdas:&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;(DirectoryStream<Path>&nbsp;dirStream&nbsp;=&nbsp;Files.newDirectoryStream( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paths.get(".."),&nbsp;"Test?/sample*.txt"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirStream.forEach(path&nbsp;->&nbsp;System.out.println(path)); &nbsp;&nbsp;&nbsp;&nbsp;}或&nbsp;&nbsp;&nbsp;&nbsp;PathMatcher&nbsp;pathMatcher&nbsp;=&nbsp;FileSystems.getDefault() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getPathMatcher("regex:Test./sample\\w+\\.txt"); &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;(DirectoryStream<Path>&nbsp;dirStream&nbsp;=&nbsp;Files.newDirectoryStream( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;File("..").toPath(),&nbsp;pathMatcher::matches))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirStream.forEach(path&nbsp;->&nbsp;System.out.println(path)); &nbsp;&nbsp;&nbsp;&nbsp;}
随时随地看视频慕课网APP

相关分类

Java
我要回答