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读取数据问题相关推荐

  1. java 获取nodejs端Gson数据案例(请求MongoDB)

    java  获取nodejs端Gson数据案例 原理:这是一个demo,主要通过java向nodejs端发送请求,nodejs端向mongodb请求数据,并将请求的数据以Gson的格式返回给java端 ...

  2. JAVA获取excel第一列数据

    JAVA获取excel第一列数据 提示 1:需要将.xlsx格式转为.xls(不懂得自行百度) 2:不要一次读取太多数据,导致内存溢出 一个简单的方法========== @GetMapping(&q ...

  3. Java获取Prometheus监控指标数据

    Java获取Prometheus监控指标数据 一. 准备工作 1. 有可以被Prometheus监控的服务 没有的话可以参考以下链接本地搭建:SpringBoot应用接入Prometheus+Graf ...

  4. java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项

    本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...

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

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

  6. 【转载】java InputStream读取数据问题

    原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read()      ...

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

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

  8. Java从控制台中读取数据完全攻略

    0 引言 从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增 ...

  9. java 从excel中读取数据_java如何从excel中读出数据

    package myexceltest; import jxl.*; import java.io.*; import jxl.write.*; /** * java读取Excel表格,拷贝.更新Ex ...

最新文章

  1. java父子表_数据库二维表转父子关系,java,stream,list
  2. sosoApi 环境搭建
  3. [YTU]_2635(P4 游戏中的Human角色)
  4. 【转】VS问题集合,不用也要收藏防止以后使用找不到
  5. Java基于opencv实现图像数字识别(一),java开发面试笔试题
  6. MFC开发IM-MFC中Arc函数的参数分别是什么意思
  7. Python基础教程笔记——列表和元组
  8. [COLING18]两种成分句法分析的局部特征模型
  9. 解构淘宝SPM/SCM流量跟踪体系
  10. android 获取软件签名,获取Android应用签名
  11. 示例项目:简单的六足步行者
  12. Ubuntu 16.04 安装 破解版的PyCharm
  13. 【电信学】【2011.06】​基于空时空频编码的MIMO-OFDM通信信道估计与性能分析
  14. od反汇编linux,新手学习反汇编之OD寻找功能call
  15. 端电压,相电压,线电压区别
  16. HDU 6447 YJJ's Salesman (dp+树状数组+莫干山算法)
  17. Calibre for Mac v5.29.0电子书阅读管理工具
  18. ORB-SLAM3的Euroc数据集测试
  19. MATLAB高光谱图像处理基础
  20. css样式的叠加,CSS的叠加

热门文章

  1. 什么是内核——linux内核解析
  2. 钉钉打卡使用H3C AP报错解决办法
  3. 网络安全系列连载(1)到底什么是数字证书
  4. 华为荣耀8x鸿蒙系统,采用鸿蒙系统的荣耀智慧屏正式亮相
  5. java flexpaper 使用_flexpaper使用介绍
  6. 内存泄露和内存溢出的区别是什么?
  7. 支付宝小程序授权登录 (Java 后台篇)
  8. Ajax原理是什么?如何实现?
  9. 11.网络协议-HTTP及HTTPS协议
  10. Pandas中的map(), apply()和applymap()的应用