Java字节流实现文件分片上传的核心是客户端按固定大小切分并逐片读写、服务端接收暂存后合并:1.客户端用FileInputStream+byte[]缓冲区流式读取,记录片序号;2.服务端用FileOutputStream写临时片文件,再按序合并;3.需校验read()返回值、避免内存溢出、清理临时文件。

Java 中用字节流实现简易文件分片上传,核心是:按固定大小切分文件 → 逐片读取字节 → 发送至服务端 → 服务端合并。关键在客户端分片逻辑和字节流的可控读写,不依赖第三方框架,纯 JDK 即可完成。
1. 客户端:用 FileInputStream + byte[] 分片读取
将大文件按指定大小(如 1MB)拆成多个字节块,每块单独处理:
- 创建 FileInputStream 打开原始文件
- 用固定长度的 byte[] buffer = new byte[1024 * 1024] 作为读取缓冲区
- 循环调用 inputStream.read(buffer),返回实际读取字节数;每次读完即为一片数据
- 记录当前偏移量(或片序号),用于服务端识别顺序(如参数 chunkIndex=0、totalChunks=5)
- 每片可封装为 HttpURLConnection 或 OkHttp 的 POST 请求,以 multipart/form-data 或纯二进制(Content-Type: application/octet-stream)方式上传
2. 服务端:接收分片并暂存为临时文件
Spring Boot 示例(使用 @RequestBody byte[] 或 MultipartFile 接收):
- 提取请求参数:chunkIndex、totalChunks、identifier(如文件名+MD5,用于关联同一文件的所有片)
- 将接收到的字节数据写入临时目录,命名格式如:upload_abc123_part_2.tmp
- 使用 FileOutputStream 写入,确保 append=false(每片独立写)
- 所有分片接收完成后,按 chunkIndex 升序合并到目标文件(用 FileInputStream 逐片读 + FileOutputStream 追加写)
3. 关键细节与避坑点
- read() 返回值必须检查:它可能小于 buffer 长度(尤其最后一片),不可直接假设填满;用实际返回值 len 控制写入范围
- 避免内存溢出:不要一次性 Files.readAllBytes() 整个大文件;始终流式分片读写
- 临时文件需清理:合并成功后删除所有 _part_*.tmp;失败时也应有超时清理机制
- 支持断点续传(可选增强):服务端可先查询已上传的片列表,跳过已存在的 chunkIndex
- 简单校验建议:客户端计算每片 SHA-256,服务端比对;或整体文件 MD5 在合并后验证
4. 合并文件的字节流写法示例
服务端合并逻辑(纯 JDK,无依赖):
立即学习“Java免费学习笔记(深入)”;
- 创建目标 FileOutputStream out = new FileOutputStream(targetFile, false)
- 按 chunkIndex 从小到大遍历临时片文件
- 对每个片:
→ FileInputStream in = new FileInputStream(partFile)
→ 循环 in.read(buffer),用 out.write(buffer, 0, len) 写入
→ in.close() - 最后 out.close(),完成合并


















