Java 如何复制文件
日常做Java开发时,复制文件是非常高频的操作——比如把用户上传的头像存到不同文件夹,或者把服务器的日志备份到本地。很多新手刚接触时,会觉得这是个麻烦事,其实Java早就提供了现成的工具,不用自己写复杂的读写逻辑。下面就用生活化的例子,拆解3种常用的文件复制方法,从简单到实用,一步步讲清楚。
最省心的原生工具类:Files.copy
如果是Java 7及以上版本,直接用java.nio.file.Files这个工具类就行,它是Java官方专门用来处理文件系统的,复制文件只需要一行核心代码,相当于你把家里的快递交给小区菜鸟驿站,驿站帮你直接送到新地址,不用自己打包搬货。

举个实际的例子:你想把桌面的“工作周报.docx”复制到U盘根目录,只需要写这么几行代码:
`java
import java.nio.file.Files;
import java.nio.file.Paths;
public class FileCopyDemo {
public static void main(String[] args) {
try {
// 原文件路径:桌面的周报
var source = Paths.get("C:/Users/你的用户名/Desktop/工作周报.docx");
// 目标路径:U盘的根目录
var target = Paths.get("E:/工作周报_备份.docx");
// 一行搞定复制!
Files.copy(source, target);
System.out.println("文件复制成功啦~");
} catch (Exception e) {
System.out.println("复制失败:" + e.getMessage());
}
}
}
`
这里要注意两个细节:一是路径用/或者\\都可以,不用纠结Windows的反斜杠转义;二是如果目标路径已经有同名文件,Files.copy会报错,想要覆盖的话,加个参数Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING)就好,相当于快递站允许你直接覆盖旧包裹。
兼容旧版本的基础流复制
如果你的项目还在用Java 6,没有Files工具类,也可以用大家更熟悉的IO流来复制,相当于你自己把文件打包、搬过去,虽然步骤多一点,但兼容性拉满,就像老房子搬家,不用依赖新小区的快递柜。
基础思路是:用输入流读原文件,用输出流写新文件,边读边写,适合中等大小的文件(比如几MB的文档、图片)。代码大概是这样:
`java
import java.io.*;
public class OldCopyDemo {
public static void main(String[] args) {
File sourceFile = new File("C:/Users/你的用户名/Desktop/风景照.jpg");
File targetFile = new File("D:/备份/风景照.jpg");
try (// 用try-with-resources自动关闭流,不用手动关
FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(targetFile)) {
// 每次读1KB的内容,避免一次性占太多内存
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("旧版本复制成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
`
这个方法要注意:用try-with-resources是必须的,不然流没关会占资源,就像搬家后没关房门,还留着门缝;如果是大文件(比如几个GB的视频),这个方法的速度会慢一点,因为每次只搬1KB,相当于每次只拿1块砖。
大文件专用的高效复制
如果要复制的是几个GB的视频、安装包,用刚才的流复制就太慢了,相当于你每次只能搬1块砖,得跑几千次。Java里有个NIO的FileChannel,相当于用小推车一次拉一整筐砖,速度能快好几倍,非常适合大文件。
它的用法也不复杂,核心是transferTo方法,直接把原文件通道的内容转到目标通道:
`java
import java.io.*;
import java.nio.channels.FileChannel;
public class BigFileCopyDemo {
public static void main(String[] args) {
File sourceFile = new File("F:/电影/新上映电影.mp4");
File targetFile = new File("G:/备份电影/新上映电影_备份.mp4");
try (FileChannel sourceChannel = new FileInputStream(sourceFile).getChannel();
FileChannel targetChannel = new FileOutputStream(targetFile).getChannel()) {
// 直接把原文件通道的内容转到目标通道
sourceChannel.transferTo(0, sourceChannel.size(), targetChannel);
System.out.println("大文件复制完成,速度超快!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
`
这个方法的优势是,操作系统会优化底层的复制逻辑,不用Java每次转内存,就像官方安排的搬家车队,比自己用小推车效率高多了,复制几个GB的文件可能几分钟就好,而基础流可能要十几分钟。
最后总结一下:Java复制文件不用自己造轮子,优先用Files.copy(Java7+),简单省心;旧项目用IO流,兼容所有版本;大文件选FileChannel,速度快还省内存,根据自己的场景选对方法就行。