原文链接: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读取数据问题相关推荐

  1. java InputStream读取数据问题【转http://cuisuqiang.iteye.com/blog/1434416】

    首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...

  2. java InputStream读取数据问题【转】http://cuisuqiang.iteye.com/blog/1434416

    首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...

  3. inputstream读取html乱码,java InputStream 读取汉语言内容的解决乱码

    java InputStream 读取中文内容的解决乱码 String suffix=file.substring(file.lastIndexOf('.')+1,file.length()); if ...

  4. java怎么读取数据?

    Java属于入门容易,天花板却极高的编程语言.java怎么读取数据?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了java怎么读取数据?等相关问题 ...

  5. java获取inputstream_java InputStream读取数据问题

    1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的 ...

  6. InputStream读取数据

    InputStream读取流有三个方法: read() read(byte[] b) read(byte[] b, int off, int len) 在从数据流里读取数据时,为图简单,经常用Inpu ...

  7. java dataset读取数据,TensorFlow读写数据

    前言 回顾前面: 众所周知,要训练出一个模型,首先我们得有数据.我们第一个例子中,直接使用dataset的api去加载mnist的数据.(minst的数据要么我们是提前下载好,放在对应的目录上,要么就 ...

  8. java acr122 读取数据_使用ACR122U 从NTAG203Chip 读取数据

    1.使用NFC Pro(Android APK)读取的TAG信息: 2.连接ACR 122U之后,从设备管理处可以看出ACR122U采用标准的微软CCID和PC/SC驱动(USB CCID): 3.P ...

  9. java 分段读取数据_java _io_ .read()分段读取字节

    java _io_ .read()分段读取字节 发布时间:2020-05-06 11:22:43 来源:51CTO 阅读:256 作者:wx5d21d5e6e5ab1 byte[] flush =ne ...

最新文章

  1. paypal提现软件_PayPal软件工程师生命中的一天
  2. 直播|清华谢晓晖——面向互联网图像搜索的用户行为模型研究
  3. Android使用磁盘缓存DiskLruCache
  4. 《Unity开发实战》——3.9节鼠标悬停时高亮显示材质
  5. Python索引index常用的8种操作
  6. 贪心算法---背包问题(物品可以分割问题)
  7. ES6学习(var,let,const区别)
  8. php向后兼容,PHP: 不向后兼容的变更 - Manual
  9. pandas 转化np数据_python,numpy,pandas数据处理之小技巧
  10. 基本的Java的MVC入门案例
  11. 2021-09-07
  12. Labview操作sqlite数据库
  13. python网校_《猎豹网校:快速掌握Python系统管理-53讲》
  14. 前端屏幕尺寸和分辨率_移动端尺寸基础知识
  15. KGB知识图谱通过数据可视化提升金融行业分析能力
  16. 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx
  17. 眼科赛道的“觉醒年代”,清晰医疗赴港能否具备后发优势?
  18. mysql服务账号密码忘记_windows mysql 账号密码忘了怎么办
  19. php opcode逆向还原,[原创]VM代码的还原-插件篇
  20. anaconda初体验

热门文章

  1. Android对Bitmap的内存优化
  2. 归纳(四):树链剖分
  3. Hive篇--搭建Hive集群
  4. shell的if和else
  5. duilib WindowImplBase BUG修复 --- 按一次ESC键, 关闭多个窗口
  6. IE6,IE7下按钮(BUTTON)变宽
  7. 【转】jQuery 1.3 正式版 下载
  8. react留言功能准备一
  9. 电机的入门之路系列3--直流电机的工作原理
  10. TTS技术简单介绍和Ekho(余音)TTS的安装与编程