文章目录
- 问题
- 分析
- 解决方式
- while循环分段读
- for循环一个一个字节读
BufferedInputStream的作用是为其它输入流提供缓冲功能。创建BufferedInputStream时,我们会通过它的构造函数指定某个输入流为参数。BufferedInputStream会将该输入流数据分批读取,每次读取一部分到缓冲中;操作完缓冲中的这部分数据之后,再从输入流中读取下一部分的数据。
问题
最近在一次和服务端通信的过程中遇到一个问题,服务端返回的数据流大小为2602个字节,我在客户端接收的时候,一次性读不完这些字节数。示例代码如下:
byte[] buffer = new byte[2602];
// 将缓冲区中的数据写入到字节数组buffer中。0是字节数组buffer的起始位置,2602是写入长度
int pos = read(buffer, 0, 2602);
上述示例代码中正常pos值应该为2602,可有时候为1434,即读取了1434个字节。
分析
首先我们要清楚BufferedInputStream填充区默认是8192个字节,这个缓冲区不是一次性填满的,而是逐次来填充的,即用户读取完当前的数据后,再被填充,如此循环一直结束。
解决方式
上述所描述的2602字节,是服务器端返回的数据,实际项目中肯定会是变量,取决于服务端返回的数据长度。
while循环分段读
int num = 0;
while (num < 2602) {
int pos = read(buffer, num, 2602 - num);
num += pos;
}
for循环一个一个字节读
int num = 0;
for (int i=0;i<2602;i++) {
buffer[i] = (byte)read();
num++;
}