`
chencvgk
  • 浏览: 15492 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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)

分享到:
评论

相关推荐

    inputstream读取数据的问题

    inputstream读取数据的问题,对你的file的帮组是很大的。

    java InputStream读取数据问题

    NULL 博文链接:https://cuisuqiang.iteye.com/blog/1434416

    springboot 解决InputStream只能读取一次的问题

    springboot 解决InputStream只能读取一次的问题

    Java流(文件读写操作)

    – 输出流:只能向其写入字节数据,而不能从中读取数据 • 按照流所处理的数据类型 – 字节流:用于处理字节数据。 – 字符流:用于处理Unicode字符数据。 • 按照流所处理的源 – 节点流:从/向一个特定的IO设备读/...

    读取图片数据到byte[]数组,合并inputStream每次读取产生的缓冲byte[]

    NULL 博文链接:https://f543711700.iteye.com/blog/678519

    Android串口读取库

    Android串口读取库,SerialPort.newBuilder(port, btl) .build()打开串口,serialPort.inputStream读取流数据

    InputStream

    读取网络字节流 php stream 二进制

    java的poi技术读取Excel数据到MySQL

    应用java的poi技术读取Excel数据到MySQL的实例源码,对学习Java编程技术有所帮助,与大家分享。

    java读取.xlxs Excel文件

    File file = new File("C:/Users/... //读取第一列数据 XSSFCell two = xssfRow.getCell(1); //读取第二列数据 XSSFCell three = xssfRow.getCell(2); //读取第三列数据 System.out.println(three); } } }

    JAVA IO流技术

    字节流:按照字节读取数据(InputStream、OutputStream) 字符流:按照字符读取数据(Reader、Writer) 功能不同: 节点流:可以直接从数据源或目的地读写数据。 处理流:不直接连接到数据源或目的地,是处理流的流...

    JAVA语言中read方法分析

    read0:从输人流中读取数据的下一个字节。 read(byte[]b):从输入流中读取一定数量的字节,并将其存储在缓 冲区数组b中 read(byte[]b,int oK int len):将输入流中最多len个数据字节渎 入byte数组,从下标为off的...

    详解FileInputStream读取文件数据的两种方式

    主要介绍了详解FileInputStream读取文件数据的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java IO流读写

    1.DataInputStream,DataOutputStream 从Stream里读取基本类型的数据 BufferedReader,BufferedWriter 从Reader/Writer里读取基本类型的数据 2.BufferedInputStream,BufferedOutputStream 封装了从缓冲区读写指定...

    java_对excel_的操作源码(有备无患)

    1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语:工作薄),下面的代码片段举例说明了应该如何操作...

    HTML5 文件域+FileReader 分段读取文件并上传到服务器

    说明:使用Ajax方式上传,文件不能过大,最好小于三四百兆,因为过多的连续Ajax请求会使后台崩溃,获取InputStream中数据会为空,尤其在Google浏览器测试过程中。 1.简单分段读取文件为Blob,ajax上传到服务器 ...

    Java文件读写操作函数实现

    //读取键盘上的数据。 * * 或者 InputStream in = new FileInputStream(String fileName);//读取文件中的数据。可以看出 * FileInputStream 为InputStream的子类。 * * 主要方法:int read();//读取单个字符...

    txt读取文本

    //用来装载一行行读取后的数据集合 InputStream inputStream=null;//写入流 BufferedReader bufReader =null;//行读取器 try{ FileWriter fw = new FileWriter(path); for (int i = 0; i ; i++) { ...

    Excel POI读取封装(文件+示范代码)

    // 将从Excel表格读取到的数据与配置文件筛选成可以插入到数据库的数据 public List, Object&gt;&gt; parseExcelData( List, String&gt;&gt; excelDataMap, Map, List&lt;ExcelMap&gt;&gt; dbfield) { List, Object&gt;&gt; list = new ...

    android 开发中用json解析客户端与服务器端的代码

    游戏开发中客户端与服务器端数据的传输, URL url = new URL(path); //创建一个Url对象 //得到打开的链接对象 HttpURLConnection conn = (HttpURLConnection)url.openConnection()... //从Json数组对象读取数据

    教你彻底明白Java的IO系统

    1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型: 1.1 以字节为导向的stream 以字节为导向的stream,表示以...

Global site tag (gtag.js) - Google Analytics