Java 如何复制文件

日常做Java开发时,复制文件是非常高频的操作——比如把用户上传的头像存到不同文件夹,或者把服务器的日志备份到本地。很多新手刚接触时,会觉得这是个麻烦事,其实Java早就提供了现成的工具,不用自己写复杂的读写逻辑。下面就用生活化的例子,拆解3种常用的文件复制方法,从简单到实用,一步步讲清楚。

最省心的原生工具类:Files.copy

如果是Java 7及以上版本,直接用java.nio.file.Files这个工具类就行,它是Java官方专门用来处理文件系统的,复制文件只需要一行核心代码,相当于你把家里的快递交给小区菜鸟驿站,驿站帮你直接送到新地址,不用自己打包搬货。

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,速度快还省内存,根据自己的场景选对方法就行。

上一篇 C / C++ 编程语言核心特性与常见应用场景知识科普