364. Java IO API - 复制文件和目录

文章目录

  • [364. Java IO API - 复制文件和目录](#364. Java IO API - 复制文件和目录)
      • [✅ 1. 基本用法](#✅ 1. 基本用法)
      • [⚙️ 2. 常用复制选项(CopyOption)](#⚙️ 2. 常用复制选项(CopyOption))
      • [📁 3. 注意:目录复制不包含内容!](#📁 3. 注意:目录复制不包含内容!)
      • [🔗 4. 关于符号链接的行为](#🔗 4. 关于符号链接的行为)
      • [🧪 示例:完整文件复制流程](#🧪 示例:完整文件复制流程)
      • [🔁 5. 从流中复制 / 到流中复制](#🔁 5. 从流中复制 / 到流中复制)
        • [➡️ InputStream → File](#➡️ InputStream → File)
        • [➡️ File → OutputStream](#➡️ File → OutputStream)
      • [🚧 常见错误与建议](#🚧 常见错误与建议)
      • [📌 小结](#📌 小结)

364. Java IO API - 复制文件和目录

在日常开发中,复制文件或目录是非常常见的需求。Java 提供了灵活且强大的 Files.copy() 方法来处理这些操作。


✅ 1. 基本用法

java 复制代码
Files.copy(sourcePath, targetPath);

这行代码会尝试将 sourcePath 复制到 targetPath,但如果目标已存在,会抛出 FileAlreadyExistsException


⚙️ 2. 常用复制选项(CopyOption)

你可以使用可变参数(varargs)形式传入多个选项:

java 复制代码
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
枚举常量 含义说明
REPLACE_EXISTING 如果目标已存在则替换。对于符号链接,会复制"链接本身",而非其指向目标。
COPY_ATTRIBUTES 尽量复制原文件的属性(如修改时间等)。平台支持情况可能不同。
NOFOLLOW_LINKS 如果源是符号链接,仅复制链接本身,而不跟踪其目标。

📁 3. 注意:目录复制不包含内容!

虽然你可以复制一个目录:

java 复制代码
Files.copy(Paths.get("docs"), Paths.get("docs_copy"));

但是这样复制的是空目录,原始目录中的子文件和子目录不会自动复制

📌 如果你想复制整个目录结构,需要使用递归或第三方库(如 Apache Commons IO)。


🔗 4. 关于符号链接的行为

默认情况下,复制符号链接会复制它所指向的目标内容:

java 复制代码
Files.copy(linkPath, copyPath); // 默认会"追踪"链接并复制目标

但如果你只想复制"链接本身":

java 复制代码
Files.copy(linkPath, copyPath, NOFOLLOW_LINKS);

🧪 示例:完整文件复制流程

java 复制代码
import java.nio.file.*;
import java.io.IOException;
import static java.nio.file.StandardCopyOption.*;

public class FileCopyDemo {
    public static void main(String[] args) {
        Path source = Paths.get("example.txt");
        Path target = Paths.get("backup/example.txt");

        try {
            Files.copy(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES);
            System.out.println("✅ 文件复制成功!");
        } catch (IOException e) {
            System.err.println("❌ 复制失败:" + e.getMessage());
        }
    }
}

🔁 5. 从流中复制 / 到流中复制

除了 Path-to-Path 的复制,Files 类还支持以下操作:

➡️ InputStream → File
java 复制代码
try (InputStream in = new FileInputStream("source.txt")) {
    Files.copy(in, Paths.get("target.txt"), REPLACE_EXISTING);
}
➡️ File → OutputStream
java 复制代码
try (OutputStream out = new FileOutputStream("output.txt")) {
    Files.copy(Paths.get("source.txt"), out);
}

适用于文件上传、下载等场景!


🚧 常见错误与建议

问题场景 建议或说明
目标文件存在导致异常 使用 REPLACE_EXISTING
复制目录却发现是空的 递归复制子文件或使用第三方库
权限不足导致 IOException 检查文件读写权限
想保留时间戳等属性但没生效 尽量使用 COPY_ATTRIBUTES,并测试平台兼容性

📌 小结

操作类别 方法
文件复制 Files.copy(Path, Path, ...)
输入流 → 文件复制 Files.copy(InputStream, Path)
文件 → 输出流复制 Files.copy(Path, OutputStream)
相关推荐
Lsir10110_1 小时前
从按钮“点不动“讲起——深入理解 Qt 信号槽机制
开发语言·qt·信号处理
君科程序定做1 小时前
用 IDL 处理高分一号(GF-1 / GF-1B/C/D)数据
c语言·开发语言
敲代码的嘎仔1 小时前
用 Redis 合并写 + DelayQueue 延迟检测,把视频播放进度写库频率降到 1/60
java·开发语言·数据库·redis·缓存·音视频·高并发
代码中介商2 小时前
C++ 预约系统实战(一):项目总览与 C/S 架构设计
c语言·开发语言·c++
youyou-06062 小时前
AUTOSAR‑COM 常见问题 QA (1)
java·linux·服务器·单片机·汽车
谢亮_vipxieliang2 小时前
ValidX时间段验证详解:ISO 8601标准与简化格式
java·spring boot·后端·spring·spring cloud·hibernate
Lsetea2 小时前
Java 请求 HTTPS 报 PKIX path building failed:从证书链到 truststore 的完整排查
java·https·ssl证书·keytool·truststore
我叫汪枫2 小时前
RAG 进阶:切分、检索、重排序,以及它和 Agent、微调、MCP 都是什么关系
开发语言·python
弘毅 失败的 mian2 小时前
数组和指针基础
c语言·开发语言·经验分享·笔记
ai小陈2 小时前
Python 3.12与CUDA 12.8镜像实战:启动GPU实例后的五项自检
开发语言·人工智能·python·深度学习·ai·gpu算力