java递归创建目录推荐用files.createdirectories()(nio.2),自动建父级且异常明确;遍历目录优先用files.walk(),支持流式处理与深度控制,避免手动递归出错。

Java 中递归创建目录用 File.mkdirs() 或 Files.createDirectories(),遍历目录推荐用 Files.walk() 或递归调用 Files.list(),现代写法优先选 NIO.2(java.nio.file)。
递归创建目录(自动建父级)
传统 File 类支持一步创建多级目录:
-
new File("a/b/c").mkdirs()—— 返回true表示成功(已存在也算成功);若磁盘只读或权限不足会返回false - 注意:
mkdir()只建最后一级,mkdirs()才递归建所有不存在的父目录
NIO.2 更健壮,推荐使用:
-
Files.createDirectories(Paths.get("a/b/c"))—— 成功返回Path,失败抛出明确异常(如IOException、SecurityException) - 可配合
StandardCopyOption.REPLACE_EXISTING等选项控制行为,但创建目录本身不需该选项
递归遍历目录(含子目录与文件)
避免手写递归易出错,NIO.2 提供简洁安全的方式:
-
Files.walk(Paths.get("src"))返回Stream<path></path>,默认深度优先、最大深度不限,可链式处理: -
Files.walk(Paths.get("src"), 2)限制最多遍历 2 层(根 + 两级子目录) - 常用操作:过滤文件
.filter(Files::isRegularFile),过滤目录.filter(Files::isDirectory),获取文件大小.mapToLong(p -> Files.size(p)).sum()
若需手动控制流程(如遇到特定文件中断),可用 Files.list() + 递归:
- 对每个
Path调用Files.isDirectory()判断,是目录则再调用Files.list()继续遍历 - 注意:必须在
try-with-resources中使用Files.list(),否则可能泄露文件句柄
常见坑与注意事项
实际开发中容易忽略的关键点:
-
File.list()和File.listFiles()不递归,且返回null表示访问失败(不是空目录),容易引发NullPointerException -
Files.walk()默认不遵循符号链接,如需跟随,用Files.walk(path, FileVisitOption.FOLLOW_LINKS) - Windows 路径分隔符用
\或/均可,但代码中统一用Paths.get("a", "b", "c")最安全(自动适配系统) - 遍历时若文件被外部删除/重命名,
Files.walk()可能抛NoSuchFileException,建议用try-catch包裹关键操作
一个完整小例子
创建目录并列出所有 .java 文件路径:
-
// 创建 a/b/c
Files.createDirectories(Paths.get("a", "b", "c")); -
// 遍历 src,找所有 .java 文件
try (Stream<path> stream = Files.walk(Paths.get("src"))) {<br> stream.filter(p -> p.toString().endsWith(".java"))<br> .forEach(System.out::println);<br>}</path>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











