上一篇
使用Java复制图片可通过FileInputStream和FileOutputStream实现字节流读写,或利用Files.copy()方法(Java7+)直接操作,注意处理IOException并确保资源关闭,避免内存泄漏。
方法1:使用 Files.copy()(JDK7+推荐)
import java.nio.file.*;
public class ImageCopy {
public static void main(String[] args) {
Path source = Paths.get("source.jpg");
Path target = Paths.get("copy.jpg");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("图片复制成功!");
} catch (IOException e) {
System.err.println("复制失败: " + e.getMessage());
}
}
}
优点:

- 代码简洁,无需手动关闭流
- 底层使用系统级复制,性能最佳(尤其大文件)
- 支持覆盖选项
StandardCopyOption.REPLACE_EXISTING
方法2:传统IO流(兼容所有JDK版本)
import java.io.*;
public class ImageCopy {
public static void main(String[] args) {
try (InputStream in = new FileInputStream("source.jpg");
OutputStream out = new FileOutputStream("copy.jpg")) {
byte[] buffer = new byte[8192]; // 8KB缓冲区
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
System.out.println("图片复制成功!");
} catch (IOException e) {
System.err.println("复制失败: " + e.getMessage());
}
}
}
关键点:
- 使用
try-with-resources自动关闭流,避免资源泄漏 - 缓冲区大小建议8KB(8192字节),平衡内存与IO效率
- 逐字节读取可处理任意文件类型
方法3:ImageIO.read/write(不推荐用于纯复制)
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
public class ImageCopy {
public static void main(String[] args) {
try (InputStream in = new FileInputStream("source.jpg");
OutputStream out = new FileOutputStream("copy.jpg")) {
BufferedImage image = ImageIO.read(in);
if (image == null) throw new IOException("不支持的图片格式");
ImageIO.write(image, "jpg", out); // 明确指定格式如"jpg"、"png"
System.out.println("图片复制成功!");
} catch (IOException e) {
System.err.println("复制失败: " + e.getMessage());
}
}
}
适用场景:

- 需要修改图片内容(如缩放、裁剪)
- 转换图片格式(如JPG转PNG)
缺点: - 性能较低(涉及编解码)
- 可能丢失原始元数据(EXIF信息等)
关键注意事项
- 路径问题:
- 使用绝对路径(如
C:/images/source.jpg)或项目相对路径 - 路径分隔符用
File.separator保证跨平台兼容性
- 使用绝对路径(如
- 大文件处理:
- 必须使用缓冲区(如方法2),避免
read()单字节操作 - 监控内存:复制超大文件时分批读取
- 必须使用缓冲区(如方法2),避免
- 异常处理:
- 捕获
IOException并明确提示失败原因 - 检查源文件是否存在:
Files.exists(sourcePath)
- 捕获
- 权限与覆盖:
- 目标文件需有写入权限
- 使用
REPLACE_EXISTING避免文件已存在时报错
总结建议
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 纯复制(JDK7+) | Files.copy() |
高效简洁,系统级优化 |
| 兼容旧JDK或需进度监控 | 缓冲IO流 | 灵活控制缓冲区,支持回调 |
| 修改图片内容/格式 | ImageIO |
支持图像处理操作 |
引用说明:本文代码基于Oracle官方Java文档(JDK17标准库),遵循Apache 2.0开源协议,文件操作规范参考《Java核心技术卷II》(第11版)。
ImageIO相关行为验证于ImageIO 1.0标准扩展。

