跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 实现文件夹及子目录内容的完整复制

Java 文件夹复制功能支持多级目录与文件覆盖。通过原生 API 或 NIO 工具类实现。核心步骤包括校验源路径、递归创建目标目录、区分文件与目录处理。使用 FileChannel 提升大文件效率,Files.walkFileTree 简化代码。兼容跨系统路径,处理权限异常,确保数据完整性。

念念不忘发布于 2026/3/27更新于 2026/6/619 浏览
Java 实现文件夹及子目录内容的完整复制

一、核心实现思路

  1. 校验源文件夹:确保源文件夹存在且是合法目录;
  2. 创建目标文件夹:若目标文件夹不存在,自动递归创建(包括多级父目录);
  3. 递归遍历源文件:遍历源文件夹下的所有文件/子目录,区分文件和目录分别处理;
  4. 复制文件:对文件使用字节流/通道复制,对目录递归创建并复制其内文件;
  5. 异常处理:捕获 IO 异常,保证复制过程的健壮性。

二、完整可运行代码

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * 文件夹复制工具类(支持多级目录、文件覆盖)
 */
public class FolderCopyUtil {
    /**
     * 核心方法:复制源文件夹下的所有文件/目录到目标文件夹
     * @param sourceDirPath 源文件夹路径(如:D:/source)
     * @param targetDirPath 目标文件夹路径(如:D:/target)
     * @throws IOException IO 异常(文件无法读取/写入)
     */
    public static void copyFolder(String sourceDirPath, String targetDirPath) throws IOException {
        File sourceDir = new File(sourceDirPath);
        File targetDir = new File(targetDirPath);

        // 步骤 1:校验源文件夹合法性
        if (!sourceDir.exists()) {
            throw new IOException("源文件夹不存在:" + sourceDirPath);
        }
        if (!sourceDir.isDirectory()) {
            throw new IOException("路径不是合法文件夹:" + sourceDirPath);
        }

        // 步骤 2:创建目标文件夹(递归创建多级目录,已存在则无影响)
        if (!targetDir.exists()) {
            boolean isCreated = targetDir.mkdirs();
            if (!isCreated) {
                throw new IOException("目标文件夹创建失败:" + targetDirPath);
            }
        }

        // 步骤 3:遍历源文件夹下的所有文件/子目录
        File[] files = sourceDir.listFiles();
        if (files == null) {
            // 源文件夹为空或无读取权限
            return;
        }
        for (File file : files) {
            String targetFilePath = targetDirPath + File.separator + file.getName();
            if (file.isFile()) {
                // 步骤 4:复制文件(覆盖已存在的目标文件)
                copyFile(file, new File(targetFilePath));
                System.out.println("文件复制成功:" + file.getPath() + " → " + targetFilePath);
            } else if (file.isDirectory()) {
                // 步骤 5:递归复制子目录
                copyFolder(file.getPath(), targetFilePath);
                System.out.println("目录复制成功:" + file.getPath() + " → " + targetFilePath);
            }
        }
    }

    /**
     * 辅助方法:复制单个文件(使用 NIO FileChannel,效率更高)
     * @param sourceFile 源文件
     * @param targetFile 目标文件
     * @throws IOException IO 异常
     */
    private static void copyFile(File sourceFile, File targetFile) throws IOException {
        // 覆盖目标文件(若已存在则删除后重建)
        if (targetFile.exists()) {
            boolean isDeleted = targetFile.delete();
            if (!isDeleted) {
                throw new IOException("目标文件覆盖失败,无法删除已有文件:" + targetFile.getPath());
            }
        }
        // 使用 NIO 通道复制(比传统字节流效率更高)
        try (FileInputStream fis = new FileInputStream(sourceFile);
             FileOutputStream fos = new FileOutputStream(targetFile);
             FileChannel inChannel = fis.getChannel();
             FileChannel outChannel = fos.getChannel()) {
            // 批量传输字节,避免逐字节复制,提升大文件复制效率
            long transferred = 0;
            long fileSize = inChannel.size();
            while (transferred < fileSize) {
                transferred += inChannel.transferTo(transferred, fileSize - transferred, outChannel);
            }
        }
    }

    // 测试方法
    public static void main(String[] args) {
        // 替换为你的源文件夹和目标文件夹路径
        String sourceDir = "D:/test/source";
        String targetDir = "D:/test/target";
        try {
            copyFolder(sourceDir, targetDir);
            System.out.println("文件夹复制完成!");
        } catch (IOException e) {
            System.err.println("文件夹复制失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

三、关键细节说明

  1. 核心 API 解析
    • File.mkdirs():递归创建多级目录(如目标路径是 D:/a/b/c,若 a/b 不存在,会自动创建),区别于 mkdir()(仅创建单级目录);
    • FileChannel.transferTo():NIO 通道复制文件,直接利用操作系统底层 IO,比传统 InputStream/OutputStream 逐字节复制效率高,尤其适合大文件;
    • try-with-resources:自动关闭流/通道,避免手动关闭遗漏导致的资源泄露。
  2. 关键特性适配
    • 空文件夹处理:源文件夹为空时,listFiles() 返回 null,直接返回不报错;目标空文件夹会正常创建;
    • 多级目录复制:通过递归调用 copyFolder,支持复制源文件夹下的所有子目录及文件;
    • 权限防护:若源文件无读取权限/目标文件夹无写入权限,会抛出 IOException 并提示具体原因。
  3. 路径兼容性
    • 使用 File.separator 代替硬编码的 / 或 \,兼容 Windows (\) 和 Linux/Mac (/) 系统;
    • 支持绝对路径(如 D:/test)和相对路径(如 ./source)。

覆盖目标文件:复制前先删除已存在的目标文件,确保复制的是最新文件;若需避免覆盖,可在 copyFile 方法中增加判断:

if (targetFile.exists()) {
    System.out.println("目标文件已存在,跳过复制:" + targetFile.getPath());
    return;
}

四、拓展:Java 7+ Files 工具类实现(更简洁)

若使用 Java 7 及以上版本,可借助 java.nio.file.Files 工具类简化代码,无需手动实现文件复制逻辑:

import java.io.IOException;
import java.nio.file.*;

public class FolderCopyWithFilesUtil {
    public static void copyFolder(String sourceDirPath, String targetDirPath) throws IOException {
        Path sourcePath = Paths.get(sourceDirPath);
        Path targetPath = Paths.get(targetDirPath);
        // 递归复制目录,配置复制选项(覆盖已存在文件)
        Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                // 创建目标目录(递归)
                Path targetDir = targetPath.resolve(sourcePath.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectories(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                // 复制文件(覆盖已存在)
                Path targetFile = targetPath.resolve(sourcePath.relativize(file));
                Files.copy(file, targetFile, StandardCopyOption.REPLACE_EXISTING);
                System.out.println("复制文件:" + file + " → " + targetFile);
                return FileVisitResult.CONTINUE;
            }
        });
    }

    public static void main(String[] args) {
        String sourceDir = "D:/test/source";
        String targetDir = "D:/test/target";
        try {
            copyFolder(sourceDir, targetDir);
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

  1. 核心方案:
    • 基础版:使用 File+FileChannel 实现,兼容性好,适合理解底层逻辑;
    • 简洁版:使用 Files.walkFileTree(Java 7+),代码更简洁,无需手动处理递归和文件复制;
  2. 关键要点:
    • 先校验源文件夹合法性,自动创建目标多级目录;
    • 区分文件/目录,文件用通道复制(高效),目录递归处理;
    • 处理文件覆盖/权限问题,保证复制健壮性;
  3. 适配场景:支持任意大小文件、多级目录、跨系统路径,满足绝大多数文件夹复制需求。

目录

  1. 一、核心实现思路
  2. 二、完整可运行代码
  3. 三、关键细节说明
  4. 四、拓展:Java 7+ Files 工具类实现(更简洁)
  5. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 使用 Higress MCP Server 插件将 REST API 转为 AI 工具
  • MoltBot 机器人集成钉钉 Stream 流式接入配置指南
  • 2438. 二的幂数组中查询范围内的乘积 - 位运算解法
  • OpenCV 中使用 inRange 进行 HSV 阈值操作
  • Python 爬虫实战:跨境电商数据采集与代理 IP 策略
  • YOLO26:实时目标检测的关键架构改进与性能基准测试
  • 基于 Django 框架的物流车辆预约平台设计与实现
  • 飞算 JavaAI:智能引导与协同交互驱动的 Java 开发提效实践
  • 工业级存储芯片 CSNP32GCR01-AOW 在无人机飞控系统中的应用实践
  • 基于云服务器部署 Clawdbot 实现 Telegram 机器人自动回复
  • 基于火山引擎即梦 API 的数字人视频生成示例
  • 论文阅读:Vision-Language-Action (VLA) 模型概念、进展与应用挑战
  • Discord 机器人创建与配置完整流程
  • ezdxf 库实战:使用 Python 进行 CAD 图纸自动化处理
  • AI 开发工具与学习资源指南:涵盖视频、文案及模型应用
  • DeepMind 科学家:“模型即计算机”才是 AI 未来新范式
  • 蚂蚁金服 Java 后端面试经历:一面与二面问题汇总
  • Telegram 搜索机器人搭建指南(含 Python 脚本)
  • 985 硕士研究生自媒体副业复盘:4 月收入 7975 元及运营经验总结
  • Proxmox VE (PVE) 下载和安装 Kali Linux 教程

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online