当前位置:网站首页>BufferedInputStream缓冲区填充问题
BufferedInputStream缓冲区填充问题
2022-07-22 22:51:00 【爬行的黄鹂鸟】
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++;
}
边栏推荐
- synchronized是如何實現的
- bryntum Kanban Task Board 5.1.0 JS 看板
- appendToFile追加失败
- 为什么有的人把代码写的如此复杂?
- Xiaohongshu joins hands with HMS core to enjoy HD vision and grow grass for a better life
- Go 并发编程基础:什么是上下文
- Tensorrt plug-in practice (1)
- 数的三次方根
- 传统银行票据打印系统几个关键技术点简要分析
- Has the live broadcast function of the multi merchant system been used? 666 for used friends!
猜你喜欢
随机推荐
网站图标的实现
如何高效安装MindSpore的GPU版本
第三章 栈
押注全场景,荣耀胜算几何?
Layout drawing of semi customized digital inverter
JS regular delete the span tag and the content in the tag
How to implement WebService service on the c/s side of C #
U盘被格式化数据能恢复吗,U盘被格式化了怎样恢复
Easily take you to the gate of turtle drawing
QgrapicsView实现画板
wps数据拆分
方正中期是什么级别的期货公司?开户安全可靠吗?
93.(leaflet篇)leaflet态势标绘-进攻方向修改
高精度移相(MCP41xx)程序stm32F103,F407通用,更改引脚即可(SPI软件模拟通信)
How to use C language to realize simple employee information management system
【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析
RequestContextHolder
Flink原理初探和流批一体API(二)v2
构造函数的初始化、清理及const修饰成员函数
Flynk uses liststate to implement keyedstate








