使用fileinputstream和fileoutputstream配合8kb缓冲区字节数组可高效复制任意二进制文件;需用try-with-resources自动关闭流,以read()返回值控制write()写入长度,并提前创建目标目录。

用 FileInputStream 复制本地图片或视频,本质是按字节读取源文件、再写入目标文件。关键在于使用缓冲区提升效率,避免单字节读写导致性能极低。
准备输入输出流
创建 FileInputStream 读取源文件(如 "a.jpg" 或 "b.mp4"),同时创建 FileOutputStream 写入目标路径(如 "copy_a.jpg")。注意:两个流都必须显式关闭,推荐用 try-with-resources 自动释放资源。
用字节数组作缓冲区批量读写
不要用 read() 单字节读取——对图片/视频这类大文件会严重拖慢速度。应定义一个字节数组(如 byte[] buffer = new byte[8192];),每次读取最多 8KB 数据,再调用 write(buffer, 0, len) 写入实际读到的字节数(len 可能小于数组长度,尤其在末尾)。
- 缓冲区大小建议 4KB–64KB,8KB 是常见平衡点
-
read(buffer)返回实际读取字节数,为 -1 表示读完 - 务必用返回值控制
write()的第三个参数,否则可能写入脏数据
处理异常与路径问题
文件不存在会抛 FileNotFoundException;目标目录不存在会导致写入失败,需提前创建父目录(new File(destPath).getParentFile().mkdirs())。IO 异常统一捕获 IOException 即可,无需细分。
- 源路径和目标路径建议用
File或Paths.get()构造,避免硬编码斜杠 - 中文路径在 IDE 中运行一般没问题,打包成 jar 后注意文件系统编码
- 复制过程中不解析图片/视频格式,纯字节搬运,所以任意二进制文件都适用
完整可运行示例
以下代码复制一张 PNG 图片,同样适用于 MP4、AVI、MOV 等视频文件:
try (FileInputStream fis = new FileInputStream("src.png");
FileOutputStream fos = new FileOutputStream("dst.png")) {
byte[] buf = new byte[8192];
int len;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
只要源文件是合法二进制文件,该方式就能 1:1 精确复制,画质、时长、元数据均无损。










