Java递归遍历目录核心是判断File是否为目录并递归处理子项;推荐JDK8+用Files.walk(),简洁健壮,可过滤文件、控深度;异常处理应使用walkFileTree+SimpleFileVisitor避免中断。

Java 中递归遍历指定目录下的所有文件,核心是判断当前 File 对象是否为目录,如果是,就对其子项逐一调用同一遍历逻辑;否则,就处理该文件(如打印路径、读取内容等)。
使用 File 类 + 递归方法(兼容 JDK 6+)
这是最基础、最直观的方式,适合理解原理和简单场景:
- 创建一个 void 方法,参数为
File dir - 先校验
dir != null && dir.exists() && dir.isDirectory() - 调用
dir.listFiles()获取子 File 数组(注意:可能为 null,需判空) - 遍历数组:遇到目录则递归调用自身;遇到普通文件则执行业务逻辑(如
System.out.println(file.getAbsolutePath()))
⚠️ 注意:listFiles() 在权限不足或 I/O 异常时返回 null,不能直接 for-each,必须先判空。
使用 Files.walk()(推荐,JDK 8+)
更简洁、健壮,自动处理符号链接、异常跳过(可选),且支持流式操作:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
Files.walk(Paths.get("your/dir"))返回Stream - 默认会遍历所有子孙级文件和目录;加
.filter(Files::isRegularFile)可只保留普通文件 - 加
.forEach(System.out::println)即可打印所有文件路径 - 如需控制深度(比如只查 2 层),用
Files.walk(path, maxDepth)
✅ 优势:自动跳过无法访问的子目录(不抛异常)、代码短、函数式风格清晰。
处理异常与权限问题
真实环境常遇到“拒绝访问”或“找不到路径”,不能让整个遍历中断:
- 用
Files.walk()时,默认遇到 I/O 异常会终止流;可改用Files.walkFileTree()配合SimpleFileVisitor - 重写
visitFileFailed()方法,在其中记录警告日志并返回FileVisitResult.CONTINUE,继续遍历其他路径 - 对
File.listFiles()方式,应在每次访问前 try-catch 或提前用file.canRead()做轻量检查
避免常见陷阱
递归看似简单,但几个细节容易出错:
- 忘记判空 ——
listFiles()返回 null 时直接遍历会 NPE - 忽略循环引用 —— 符号链接或硬链接导致无限递归(
Files.walk()默认不追踪符号链接,安全) - 没处理编码问题 —— 路径含中文时确保终端/IDE 控制台编码为 UTF-8
- 大目录下栈溢出风险 —— 深层嵌套目录可能导致 StackOverflowError(
Files.walk()内部用迭代实现,更稳定)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










