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
相关产品推荐
相关产品推荐

