news 2026/5/27 1:12:01

任意文件复制(字节缓冲流)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
任意文件复制(字节缓冲流)

最近学习了Java使用字节缓冲流实现任意文件复制,才知道日常开发里经常会用到文件复制功能,图片、视频、压缩包这类非文本文件,用普通字符流会出问题,字节流才是通用选择。
单纯的基础字节流读写效率偏低,今天就用 BufferedInputStream + BufferedOutputStream 字节缓冲流来实现文件复制,借助缓冲区减少磁盘交互,读写速度会明显提升,而且能适配电脑上所有格式的文件。

一、实现思路

1. 分别创建字节缓冲输入流、输出流,绑定源文件和目标文件;
2. 定义字节数组充当缓冲区,循环读取源文件数据,同步写入新文件;
3. 读写完成后手动刷新缓冲区,最后按顺序关闭流,释放资源。

二、完整代码

工具类(文件复制核心方法)

java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* 文件复制工具类
* 基于字节缓冲流实现,支持全类型文件
*/
public class FileCopyUtil {

/**
* 文件复制方法
* @param srcPath 原文件路径
* @param destPath 复制后的文件路径
*/
public static void copyFile(String srcPath, String destPath) {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;

try {
// 包装基础字节流,创建缓冲流
bis = new BufferedInputStream(new FileInputStream(srcPath));
bos = new BufferedOutputStream(new FileOutputStream(destPath));

// 自定义缓冲区,一次读取1024字节
byte[] buf = new byte[1024];
int length;

// 循环读取数据,读到文件末尾返回-1,结束循环
while ((length = bis.read(buf)) != -1) {
bos.write(buf, 0, length);
}
// 强制刷新缓冲区,保证剩余数据全部写入文件
bos.flush();
System.out.println("文件复制成功!");

} catch (IOException e) {
System.out.println("文件复制失败,请检查文件路径或文件是否存在");
e.printStackTrace();
} finally {
// 关闭流,遵循先开后关原则
try {
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


测试类

java
public class CopyTest {
public static void main(String[] args) {
// 替换成你自己的文件路径
String oldFile = "D:\\demo\\test.png";
String newFile = "D:\\demo\\copy_test.png";

// 调用方法完成复制
FileCopyUtil.copyFile(oldFile, newFile);
}
}


三、代码简单解读

1. 缓冲流属于包装流,不能单独使用,必须依托 FileInputStream 、 FileOutputStream 基础字节流。
2. 这里设置 1024 字节的数组作为缓冲区,批量读写数据,相比单字节读写,能大幅降低 IO 次数。
3. read() 方法的返回值是本次实际读取到的字节数,当返回 -1 代表文件已经读完。
4. flush() 方法建议主动调用,避免缓冲区残留数据,导致复制后的文件内容缺失。
5. 流属于系统资源,使用完毕一定要关闭,关闭顺序和创建顺序相反即可。

四、使用小提示

1. Windows 系统路径需要用 \\ 做转义,Linux、Mac 系统直接使用 / ;
2. 代码支持图片、视频、安装包、文档等所有格式,不用担心乱码问题;
3. 如果是超大文件,可以适当调大字节数组长度,进一步提升复制效率;
4. 运行前确认源文件路径正确,目标路径所在文件夹必须提前创建好。

五、总结

字节缓冲流是 Java IO 里做文件复制很实用的方案,兼顾通用性和运行效率。上面这段代码可以直接拿来使用,只需要修改文件路径就能快速完成文件复制,学习和日常开发都能用上。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 1:11:59

OPC 中国是做什么的?一文读懂 OPC 与 OPD 体系

在 AI 智能体快速迭代的今天,“单人成军” 不再是遥不可及的概念,OPC 与 OPD 体系正在重构个体价值与组织效率的边界,而 OPC 中国正是这一浪潮中的核心生态枢纽。本文将系统拆解 OPC 中国的定位、OPC 与 OPD 的核心逻辑,以及其如何…

作者头像 李华
网站建设 2026/5/27 1:08:12

在Nodejs后端服务中集成多模型API以提升应用智能

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Nodejs后端服务中集成多模型API以提升应用智能 构建具备AI能力的现代后端服务时,开发者常常面临一个核心挑战&#x…

作者头像 李华
网站建设 2026/5/27 1:05:55

Web Workers:JavaScript 的多线程编程

Web Workers:JavaScript 的多线程编程 什么是 Web Workers? Web Workers 允许在后台线程中运行脚本,不阻塞主线程。 Web Workers 的类型 类型说明Dedicated Worker专用 Worker,只能被创建它的脚本使用Shared Worker共享 Worker&am…

作者头像 李华
网站建设 2026/5/27 1:05:06

CRNN实战解析:从图像到文本的端到端识别之旅

1. CRNN模型初探:为什么它是OCR的首选? 第一次接触CRNN时,我被它的设计哲学惊艳到了。传统OCR流程像流水线作业:先文字检测再单字识别,每个环节都可能误差累积。而CRNN直接把整张图片扔进网络,输出就是识别…

作者头像 李华
网站建设 2026/5/27 1:03:50

优雅的桌面歌词体验:LyricsX Swift插件深度解析

优雅的桌面歌词体验:LyricsX Swift插件深度解析 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 你是否曾在聆听音乐时渴望一种更沉浸式的体验?当美…

作者头像 李华