java获取inputstream_java InputStream读取数据问题
1. 关于InputStream.read()
在从数据流里读取数据时,为图简单,经常用InputStream.read()方法。这个方法是从流里每次只读取读取一个字节,效率会非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。
2. 关于InputStream类的available()方法
要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本
地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。
如果这样写代码:
int count = in.available();
byte[] b = new byte[count];
in.read(b);
在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。
需要改成这样:
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] b = new byte[count];
in.read(b);
3. 关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
byte[] b = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount < count) {
readCount += in.read(bytes, readCount, count - readCount);
}
用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)
java获取inputstream_java InputStream读取数据问题相关推荐
- java 获取nodejs端Gson数据案例(请求MongoDB)
java 获取nodejs端Gson数据案例 原理:这是一个demo,主要通过java向nodejs端发送请求,nodejs端向mongodb请求数据,并将请求的数据以Gson的格式返回给java端 ...
- JAVA获取excel第一列数据
JAVA获取excel第一列数据 提示 1:需要将.xlsx格式转为.xls(不懂得自行百度) 2:不要一次读取太多数据,导致内存溢出 一个简单的方法========== @GetMapping(&q ...
- Java获取Prometheus监控指标数据
Java获取Prometheus监控指标数据 一. 准备工作 1. 有可以被Prometheus监控的服务 没有的话可以参考以下链接本地搭建:SpringBoot应用接入Prometheus+Graf ...
- java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项
本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...
- java InputStream读取数据问题【转http://cuisuqiang.iteye.com/blog/1434416】
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...
- 【转载】java InputStream读取数据问题
原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read() ...
- java InputStream读取数据问题【转】http://cuisuqiang.iteye.com/blog/1434416
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...
- Java从控制台中读取数据完全攻略
0 引言 从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增 ...
- java 从excel中读取数据_java如何从excel中读出数据
package myexceltest; import jxl.*; import java.io.*; import jxl.write.*; /** * java读取Excel表格,拷贝.更新Ex ...
最新文章
- java父子表_数据库二维表转父子关系,java,stream,list
- sosoApi 环境搭建
- [YTU]_2635(P4 游戏中的Human角色)
- 【转】VS问题集合,不用也要收藏防止以后使用找不到
- Java基于opencv实现图像数字识别(一),java开发面试笔试题
- MFC开发IM-MFC中Arc函数的参数分别是什么意思
- Python基础教程笔记——列表和元组
- [COLING18]两种成分句法分析的局部特征模型
- 解构淘宝SPM/SCM流量跟踪体系
- android 获取软件签名,获取Android应用签名
- 示例项目:简单的六足步行者
- Ubuntu 16.04 安装 破解版的PyCharm
- 【电信学】【2011.06】​基于空时空频编码的MIMO-OFDM通信信道估计与性能分析
- od反汇编linux,新手学习反汇编之OD寻找功能call
- 端电压,相电压,线电压区别
- HDU 6447 YJJ's Salesman (dp+树状数组+莫干山算法)
- Calibre for Mac v5.29.0电子书阅读管理工具
- ORB-SLAM3的Euroc数据集测试
- MATLAB高光谱图像处理基础
- css样式的叠加,CSS的叠加