Java中用Files.walkFileTree()配合SimpleFileVisitor递归复制文件夹,preVisitDirectory创建目标目录,visitFile拷贝文件,动态计算目标路径并确保根目录存在。

Java 中用 NIO 快速复制整个文件夹(含完整目录结构和所有子文件),核心是 Files.walkFileTree() 配合 SimpleFileVisitor,而不是直接调用 Files.copy() 一次——因为后者对目录只建空壳,不递归内容。
必须用 walkFileTree 实现递归遍历
这是 NIO.2 提供的流式遍历方案,边走边处理,内存友好,适合大目录:
-
preVisitDirectory:在进入每个子目录前执行,负责创建目标对应目录(用
Files.copy(dir, targetPath, REPLACE_EXISTING, COPY_ATTRIBUTES)) -
visitFile:对每个普通文件执行实际拷贝(同样用
Files.copy(),通常不加COPY_ATTRIBUTES,避免重复开销) -
visitFileFailed:建议返回
CONTINUE,避免权限不足或符号链接异常导致整个复制中断
关键代码结构要写对
目标路径必须通过 source.relativize(currentPath) 动态计算,才能保持层级关系。例如源是 ./docs,当前访问 ./docs/css/style.css,则目标应为 targetPath.resolve("css/style.css")。
别忘了提前确保目标根目录存在,否则 preVisitDirectory 第一次就会失败。可加一行:Files.createDirectories(targetRoot);
复制选项按需选择
常用组合已足够稳定:
-
REPLACE_EXISTING:覆盖同名文件/目录,避免FileAlreadyExistsException -
COPY_ATTRIBUTES:仅在preVisitDirectory中对目录使用(保留修改时间等),visitFile中一般不加,提升速度 - 慎用
FOLLOW_LINKS:默认会解引用符号链接;若只想复制链接本身,需额外传NOFOLLOW_LINKS
不要手动收集所有路径再处理
避免用 Files.list() 或 Files.walk().collect(...) 把全部路径加载进内存——遇到上万文件时极易 OOM。walkFileTree 是深度优先、一次一节点的迭代器式处理,天然支持海量文件场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











