Java 文件与文件夹复制实战
在开发过程中,我们经常需要将数据从一处迁移到另一处。Java 标准 IO 库提供了足够灵活的工具来完成这一任务。虽然 NIO.2 提供了更现代的方案,但传统的流式处理在某些场景下依然直观且高效。
单文件复制逻辑
核心思路是读取源文件流,写入目标文件流。为了效率,我们使用缓冲区进行批量读写,而不是每次只读一个字节。这里需要注意路径的拼接方式,跨平台环境下建议使用 File.separator 来保证兼容性。
import java.io.*;
public class FileCopyUtil {
/**
* 复制单个文件
* @param oldPath 原文件路径,如:c:/fqf.txt
* @param newPath 复制后路径,如:f:/fqf.txt
*/
public void copyFile(String oldPath, String newPath) {
try (InputStream inStream = new FileInputStream(oldPath);
FileOutputStream fs = new FileOutputStream(newPath)) {
byte[] buffer = new byte[8192];
int length;
while ((length = inStream.read(buffer)) != -1) {
fs.write(buffer, 0, length);
}
} catch (Exception e) {
System.out.println("复制单个文件操作出错");
e.printStackTrace();
}
}
}
这段代码使用了 try-with-resources 语法,确保流在使用后能自动关闭,避免资源泄露。缓冲区大小设为 8192 字节,这是内存与 I/O 效率的一个平衡点。实际运行时,如果源文件不存在或权限不足,会抛出异常并打印堆栈信息。
递归复制整个文件夹
文件夹复制比单文件复杂,因为需要遍历目录结构并创建对应的子目录。这里采用递归的方式,遇到文件则调用复制逻辑,遇到目录则继续深入。
import java.io.*;
import java.util.Arrays;
{
{
{
(newPath).mkdirs();
(oldPath);
String[] file = a.list();
(file == ) ;
(String fileName : file) {
(oldPath + File.separator + fileName);
(temp.isFile()) {
( (temp);
(newPath + File.separator + fileName)) {
[] b = [];
len;
((len = input.read(b)) != -) {
output.write(b, , len);
}
}
} (temp.isDirectory()) {
copyFolder(oldPath + File.separator + fileName,
newPath + File.separator + fileName);
}
}
} (Exception e) {
System.out.println();
e.printStackTrace();
}
}
}

