You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FileInputStream.read()循环多次触发问题(调试时无异常)

问题原因分析

1. InputStream.read(byte[])的行为特性

FileInputStream.read(byte[])方法不保证一次性读取满整个字节数组,它的返回值是实际读取到的字节数:

  • 当文件还有剩余数据时,可能受系统IO缓冲区大小、文件系统调度等影响,一次只读取部分字节(比如每次读取4KB或8KB),此时返回值小于数组长度但不等于-1,循环会持续执行。
  • 只有当流中无更多数据时,read才会返回-1终止循环。

你的文件大小为89432字节,即使数组长度设为89432,实际运行时也可能因IO调度原因分多次读取;而调试时因断点暂停,IO操作有足够时间完成数据读取,一次就填满数组,所以循环仅执行一次。

2. 完整代码中chunkSize的实际配置问题

看你完整代码里的字节数组初始化逻辑:

byte[] chunkBytes = new byte[uploadEntity.getFile().length()<=uploadEntity.getChunkSize()? (int)uploadEntity.getFile().length() : uploadEntity.getChunkSize()];

如果uploadEntity.getChunkSize()的实际值远小于89432(比如设置为8192字节),数组长度就会是8192,89432字节的文件需要读取约11次,这直接导致循环触发十多次,和你描述的现象完全匹配。

3. 异步请求引发的潜在数据错误(额外问题)

你的代码还有一个严重隐患:循环复用同一个chunkBytes数组,且使用OkHttp的异步enqueue发送请求。由于异步请求不会阻塞循环执行,下一次循环会立即覆盖chunkBytes的内容,导致所有异步请求的RequestBody最终引用的都是最后一次读取的数据,上传的文件内容会完全错误。


内容的提问来源于stack exchange,提问作者ErrorCodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:50:20