【转载】java InputStream读取数据问题
原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html
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)
转载于:https://www.cnblogs.com/zhang-yi-bin/p/4478343.html
【转载】java InputStream读取数据问题相关推荐
- 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://cuisuqiang.iteye.com/blog/1434416
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...
- inputstream读取html乱码,java InputStream 读取汉语言内容的解决乱码
java InputStream 读取中文内容的解决乱码 String suffix=file.substring(file.lastIndexOf('.')+1,file.length()); if ...
- java怎么读取数据?
Java属于入门容易,天花板却极高的编程语言.java怎么读取数据?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了java怎么读取数据?等相关问题 ...
- java获取inputstream_java InputStream读取数据问题
1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低. 更好的 ...
- InputStream读取数据
InputStream读取流有三个方法: read() read(byte[] b) read(byte[] b, int off, int len) 在从数据流里读取数据时,为图简单,经常用Inpu ...
- java dataset读取数据,TensorFlow读写数据
前言 回顾前面: 众所周知,要训练出一个模型,首先我们得有数据.我们第一个例子中,直接使用dataset的api去加载mnist的数据.(minst的数据要么我们是提前下载好,放在对应的目录上,要么就 ...
- java acr122 读取数据_使用ACR122U 从NTAG203Chip 读取数据
1.使用NFC Pro(Android APK)读取的TAG信息: 2.连接ACR 122U之后,从设备管理处可以看出ACR122U采用标准的微软CCID和PC/SC驱动(USB CCID): 3.P ...
- java 分段读取数据_java _io_ .read()分段读取字节
java _io_ .read()分段读取字节 发布时间:2020-05-06 11:22:43 来源:51CTO 阅读:256 作者:wx5d21d5e6e5ab1 byte[] flush =ne ...
最新文章
- paypal提现软件_PayPal软件工程师生命中的一天
- 直播|清华谢晓晖——面向互联网图像搜索的用户行为模型研究
- Android使用磁盘缓存DiskLruCache
- 《Unity开发实战》——3.9节鼠标悬停时高亮显示材质
- Python索引index常用的8种操作
- 贪心算法---背包问题(物品可以分割问题)
- ES6学习(var,let,const区别)
- php向后兼容,PHP: 不向后兼容的变更 - Manual
- pandas 转化np数据_python,numpy,pandas数据处理之小技巧
- 基本的Java的MVC入门案例
- 2021-09-07
- Labview操作sqlite数据库
- python网校_《猎豹网校:快速掌握Python系统管理-53讲》
- 前端屏幕尺寸和分辨率_移动端尺寸基础知识
- KGB知识图谱通过数据可视化提升金融行业分析能力
- 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx
- 眼科赛道的“觉醒年代”,清晰医疗赴港能否具备后发优势?
- mysql服务账号密码忘记_windows mysql 账号密码忘了怎么办
- php opcode逆向还原,[原创]VM代码的还原-插件篇
- anaconda初体验