FileSystem.getPathMatcher仅用于路径匹配,需先用Files.walk()等获取路径流,再用filter(matcher::matches)筛选,最后遍历;注意matches()对路径基准敏感,推荐用绝对路径配合**模式或relativize()转换。

Java 中 FileSystem.getPathMatcher 本身不返回文件列表,它只负责匹配路径字符串(如 "glob:**/*.txt"),你需要先获取文件集合(比如通过 Files.walk() 或 Files.list()),再用 PathMatcher 过滤,最后才能用 for-each 遍历结果。
1. 先创建 PathMatcher 实例
PathMatcher 是基于文件系统的,必须从 FileSystem 获取:
FileSystem fs = FileSystems.getDefault();
PathMatcher matcher = fs.getPathMatcher("glob:**/*.log"); // 匹配所有 .log 文件
2. 获取路径流并过滤匹配项
推荐用 Files.walk() 遍历目录树,再用 filter() 和 PathMatcher.matches() 筛选:
try (Stream<Path> paths = Files.walk(Paths.get("/var/log"))) {
List<Path> matched = paths
.filter(matcher::matches)
.collect(Collectors.toList());
// 现在可以用 for-each 遍历
for (Path p : matched) {
System.out.println(p);
}
}
3. 注意 matches() 的路径基准问题
PathMatcher.matches() 判断的是整个路径是否符合模式。如果模式是 "glob:*.txt",它只会匹配直接在当前目录下的 .txt 文件,不会匹配子目录中的;而 "glob:**/*.txt" 才能递归匹配。
立即学习“Java免费学习笔记(深入)”;
- 确保传入
matches()的Path是相对路径或与模式语义一致的路径 - 若从
Files.walk(root)得到绝对路径,且模式含**,一般可直接用 - 若需统一行为,可用
root.relativize(p)转为相对路径再匹配
4. 替代方案:边遍历边处理,避免收集到 List
如果只是想逐个处理匹配文件,无需缓存全部路径,可跳过 collect(),直接在 stream 中操作:
try (Stream<Path> paths = Files.walk(Paths.get("src"))) {
paths.filter(matcher::matches)
.forEach(path -> {
try {
System.out.println(path + " → " + Files.size(path));
} catch (IOException e) {
System.err.println("无法读取大小: " + path);
}
});
}


















