377. Java IO API - 什么是 Glob?——轻量级的文件名匹配语法

0 阅读2分钟

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 个字符加 .txtabc.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*}temptmp 开头的文件名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>