377. Java IO API - 什么是 Glob?——轻量级的文件名匹配语法
Glob 是一种用于简洁匹配文件路径或名称的模式语法。你可以在 Java 的文件操作中使用 glob 语法进行目录过滤(如 Files.newDirectoryStream(...))或者通过 FileSystem.getPathMatcher("glob:...") 创建路径匹配器。
Glob 更简单直观,适合大多数文件名匹配场景。相比正则表达式,它更短、更易读。
🧵 基本规则说明
| 语法 | 含义 |
|---|---|
* | 匹配任意长度的任意字符(包括空字符) |
** | 匹配任意层级的目录(包括路径分隔符 /) |
? | 匹配单个任意字符 |
{a,b} | 匹配其中一个子模式(a 或 b) |
[abc] | 匹配 a、b 或 c 中的任意一个字符 |
[a-z] | 匹配 a 到 z 的任意小写字母 |
\* \? | 匹配字面量星号或问号(转义特殊字符) |
🧪 示例讲解
| 匹配模式 | 匹配内容 | 示例 |
|---|---|---|
*.html | 所有 .html 结尾的文件 | index.html ✅,style.css ❌ |
???.txt | 文件名恰好为 3 个字符加 .txt | abc.txt ✅,abcd.txt ❌ |
*[0-9]* | 包含任意数字的文件名 | file1.txt ✅,notes.txt ❌ |
*.{java,class,jar} | 匹配 .java、.class、.jar 文件 | Main.java ✅ |
a?*.java | 以 a 开头,后跟至少一个字符,并以 .java 结尾 | ab.java ✅,a.java ❌ |
{temp*,tmp*} | 以 temp 或 tmp 开头的文件名 | temp123.log ✅,tmp2.txt ✅ |
{foo*,*[0-9]*} | 以 foo 开头或包含数字的文件名 | foobar.txt ✅,data3.csv ✅ |
⚠️ 注意事项
-
如果你在命令行或代码中手动输入 glob 字符串,建议加上引号防止 shell 提前展开:
"*.java" # 推荐加引号 \*.java # 或使用反斜杠转义 -
Glob 不是正则表达式。例如:
*.java是 glob 的写法,对应正则为.*\.java?[0-9]是 glob 的写法,对应正则为.\d
如果你需要更复杂的模式,可以使用
regex:开头的正则表达式形式:FileSystem fs = FileSystems.getDefault(); PathMatcher matcher = fs.getPathMatcher("regex:.*\\.java");
✅ 实战演示:筛选 .java 文件
Path dir = Paths.get("src");
try (DirectoryStream<Path> stream =
Files.newDirectoryStream(dir, "*.java")) {
for (Path entry : stream) {
System.out.println("Found Java file: " + entry.getFileName());
}
} catch (IOException e) {
System.err.println("Failed to read directory: " + e.getMessage());
}
📚 延伸阅读
- 想深入了解 glob 与正则的区别?查看:
FileSystem.getPathMatcher(String)方法的官方文档。 - 对于复杂场景,如根据文件大小、权限过滤,建议使用自定义
DirectoryStream.Filter<Path>。