使用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标准扩展。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38598.html