376. Java IO API - 使用 Globbing 和自定义 Filter 过滤目录内容

文章目录

  • [376. Java IO API - 使用 Globbing 和自定义 Filter 过滤目录内容](#376. Java IO API - 使用 Globbing 和自定义 Filter 过滤目录内容)
      • [1️⃣ 使用 **`Globbing`**(通配符匹配)](#1️⃣ 使用 Globbing(通配符匹配))
        • [🌟 示例:列出 `.java`、`.class` 和 `.jar` 文件](#🌟 示例:列出 .java、.class 和 .jar 文件)
      • [2️⃣ 编写自定义 `DirectoryStream.Filter`](#2️⃣ 编写自定义 DirectoryStream.Filter)
        • [🛠 示例:只保留目录条目的 `Filter`](#🛠 示例:只保留目录条目的 Filter)
        • [🧪 使用自定义 `Filter` 遍历目录内容](#🧪 使用自定义 Filter 遍历目录内容)
      • [🆚` Globbing` 与 自定义 `Filter` 的对比](#🆚 Globbing 与 自定义 Filter 的对比)
      • [📣 小贴士:如何过滤整个文件树?](#📣 小贴士:如何过滤整个文件树?)

376. Java IO API - 使用 Globbing 和自定义 Filter 过滤目录内容

在实际开发中,我们经常需要列出特定类型的文件,比如所有 .java 文件、所有子目录,或者符合某个命名规则的文件。Java NIO 为我们提供了两种灵活的方式:

1️⃣ 使用 Globbing(通配符匹配)

🌟 示例:列出 .java、.class 和 .jar 文件
java 复制代码
Path dir = Paths.get("your-directory-path-here");

try (DirectoryStream<Path> stream =
     Files.newDirectoryStream(dir, "*.{java,class,jar}")) {

    for (Path entry : stream) {
        System.out.println("Matched file: " + entry.getFileName());
    }

} catch (IOException e) {
    System.err.println("Failed to read directory: " + e.getMessage());
}

✅ Glob 语法说明:

  • "*.java":匹配所有以 .java 结尾的文件
  • "data-??.log":匹配如 data-01.log、data-ab.log
  • "*.{java,class,jar}":匹配多个后缀的文件,类似正则中的 | 逻辑

📘 Glob 是简单的模式匹配,不支持完整正则表达式。但足以应对常见的文件过滤需求。


2️⃣ 编写自定义 DirectoryStream.Filter

如果 glob 无法满足需求,比如:

  • 只列出子目录
  • 只列出大小大于 1MB 的文件
  • 忽略隐藏文件(以 "." 开头)

那你可以自定义一个过滤器!

🛠 示例:只保留目录条目的 Filter
java 复制代码
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    @Override
    public boolean accept(Path path) throws IOException {
        return Files.isDirectory(path);
    }
};

🧪 使用自定义 Filter 遍历目录内容
java 复制代码
Path dir = Paths.get("your-directory-path-here");

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) {
    for (Path entry : stream) {
        System.out.println("Directory found: " + entry.getFileName());
    }
} catch (IOException e) {
    System.err.println("Error reading directory: " + e.getMessage());
}

🆚 Globbing 与 自定义 Filter 的对比

对比项 Globbing 自定义 Filter
匹配方式 简单通配符(*.txt, data-??.log) 完全自定义(任意逻辑)
是否支持文件类型判断 ❌ 不支持 ✅ 支持(如 isDirectory)
复杂匹配 ❌ 较弱 ✅ 可按文件大小、日期、权限等任意条件组合
适合场景 快速过滤后缀、命名 需要高级判断(如"所有非隐藏目录")

📣 小贴士:如何过滤整个文件树?

当前例子只作用于单层目录,如果你希望:

递归查找所有子目录 (例如搜索整个工程目录下的所有 .java 文件)

✅ 推荐使用 Java NIO 提供的 Files.walkFileTree(...) 方法配合 FileVisitor 实现,详见《遍历文件树》部分的内容。

相关推荐
文丑颜不良啊2 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang3 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪3 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
用户956256254294 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
愿有所息4 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
威哥爱编程4 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
秋饼4 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
威哥爱编程4 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_967980114 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读5 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习