1. 概述
在这个教程中,我们将学习如何在Java中使用通配符字符串查找文件。
2. 引言
在编程领域,**glob是一种包含通配符的模式,用于匹配文件名**。我们将使用glob模式来过滤文件名列表。我们将使用流行的通配符“*”和“?”。自Java SE 7以来,Java就已经支持这个特性。
*Java在其FileSystem类中提供了getPathMatcher()*方法。它可以接受正则表达式(regex)或glob模式。**由于与正则表达式相比,应用通配符更简单,我们将在本例中使用glob模式。
让我们看一个使用此方法和glob模式的示例:
String pattern = "myCustomPattern";
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
以下是Java中的一些glob模式示例:
glob 描述
*.java 匹配所有扩展名为“java”的文件
*.{java,class} 匹配扩展名为“java”或“class”的所有文件
*.* 匹配名称中包含“.”的所有文件
??? 匹配名称有四个字符的所有文件
[test].docx 匹配文件名包含't', 'e', 's', 或 't' 并且扩展名为'docx'的文件
[0-4].csv 匹配文件名是'0', '1', '2', '3', 或 '4' 并且扩展名为'csv'的文件
C:\\temp\\* 在Windows系统上匹配"C:\temp"目录下的所有文件
src/test/* 在基于Unix的系统上匹配"src/test/"目录下的所有文件
3. 实现
现在让我们深入了解实现这个解决方案的细节。完成这项任务需要两个步骤。
首先,我们创建一个方法,它接受两个参数 - 搜索的根目录和要查找的通配符模式。 这个方法将包含遍历每个文件和目录的编程逻辑,利用glob模式,并最终返回匹配的文件名列表。
其次,我们使用Java提供的Files类的walkFileTree方法来触发搜索过程。
首先,让我们创建一个名为SearchFileByWildcard
的类,其中包含一个名为searchWithWc()
的方法,它接受Path
和String
模式作为参数:
class SearchFileByWildcard {
static List<String> matchesList = new ArrayList<String>();
List<String> searchWithWc(Path rootDir, String pattern) throws IOException {
matchesList.clear();
FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
FileSystem fs = FileSystems.getDefault();
PathMatcher matcher = fs.getPathMatcher(pattern);
Path name = file.getFileName();
if (matcher.matches(name)) {
matchesList.add(name.toString);
}
return FileVisitResult.CONTINUE;
}
};
Files.walkFileTree(rootDir, matcherVisitor);
return matchesList;
}
}
为了访问rootDir
中的文件,我们使用FileVisitor
接口。一旦通过调用getDefault()
方法获取到文件系统的接口,我们就可以使用FileSystem
类的getPathMatcher()
方法。在这里,我们在rootDir
内的每个文件路径上应用glob模式。
在这种情况下,我们可以使用得到的PathMatcher
来获取匹配文件名的ArrayList
。
最后,我们调用NIO Files类的walkFileTree
方法。文件遍历从rootDir
开始,树中的每个节点以深度优先的方式递归访问。matcherVisitor
包含SimpleFileVisitor
类的visitFile
方法的实现。
现在我们已经讨论了基于通配符的文件搜索的实现,接下来让我们看看一些示例输出。我们将使用以下文件结构进行演示:
如果我们传递一个包含"glob:*.{txt,docx}"
模式的String
,我们的代码将输出三个扩展名为“txt”的文件名和一个扩展名为“docx”的文件名:
SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}");
assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")),
new HashSet<>(actual));
如果我们传递一个包含"glob:????.{csv}"
模式的String
,我们的代码将输出一个由四个字符后跟"."的文件名,且扩展名为“csv”:
SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}");
assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual));
4. 总结
在这个教程中,我们学习了如何在Java中使用通配符模式查找文件。
源代码可以在GitHub上找到。