`
dss16694
  • 浏览: 148420 次
社区版块
存档分类
最新评论

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()方法才能将数据总数全部得到。
如果这样写代码:

Java代码 
  1. <span style="font-family: SimHei; font-size: 16px;">  int count = in.available();  
  2.   byte[] b = new byte[count];  
  3.   in.read(b);</span>  



在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。
需要改成这样:

Java代码 
  1. int count = 0;  
  2.  while (count == 0) {  
  3.   //count = in.available();  
  4.   
  5.   count=response.getEntity().getContentLength();//(HttpResponse response)  
  6.  }  
  7.  byte[] b = new byte[count];  
  8.  in.read(b);  

 

3. 关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:

Java代码 
  1. byte[] bytes = new byte[count];  
  2.   int readCount = 0// 已经成功读取的字节的个数  
  3.   while (readCount < count) {  
  4.    readCount += in.read(bytes, readCount, count - readCount);  
  5.   }  
  6.      

 

用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException).

==========================================================================================

代码分享

下面分享我自己写的测试代码片段,供大家参考:

Java代码 
  1. /** 
  2.      * <b>获取指定的URL返回的数据信息</b> 
  3.      * @param <font color="#efac10"><a href="http://www.baidu.com">_url:指定的URL</a></font> 
  4.      * @return 
  5.      * @throws ClientProtocolException 
  6.      * @throws IOException 
  7.      */  
  8.     public String getReponse(String _url) throws ClientProtocolException, IOException  
  9.     {  
  10.         String readContent=null;  
  11.         DefaultHttpClient httpclient = new DefaultHttpClient();  
  12.         HttpGet httpget = new HttpGet(SinaJsonTest.SinaUrl);  
  13.         System.out.println("0.Send the URL to Sina Sever....");  
  14.         HttpResponse response = httpclient.execute(httpget);  
  15.         HttpEntity entity = response.getEntity();  
  16.   
  17.         System.out.println("1.Get Response Status: " + response.getStatusLine());  
  18.         if (entity != null) {  
  19.             System.out.println("  Get ResponseContentEncoding():"+entity.getContentEncoding());  
  20.             System.out.println("  Content Length():"+entity.getContentLength());  
  21.             //getResponse  
  22.             InputStream in=entity.getContent();  
  23.             int count = 0;  
  24.             while (count == 0) {  
  25.              count = Integer.parseInt(""+entity.getContentLength());//in.available();  
  26.             }  
  27.             byte[] bytes = new byte[count];  
  28.             int readCount = 0// 已经成功读取的字节的个数  
  29.             while (readCount <= count) {  
  30.              if(readCount == count)break;  
  31.              readCount += in.read(bytes, readCount, count - readCount);  
  32.             }  
  33.               
  34.             //转换成字符串  
  35.             readContent= new String(bytes, 0, readCount, "UTF-8"); // convert to string using bytes  
  36.   
  37.             System.out.println("2.Get Response Content():\n"+readContent);  
  38.         }  
  39.         return readContent;  
  40.     }  

分享到:
评论

相关推荐

    java InputStream读取数据问题

    当我们遇到“Java InputStream读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...

    java 读取串口数据(绝对可使用)

    Java 读取串口数据是Java编程中一个重要的部分,特别是在物联网(IoT)设备通信、嵌入式系统以及工业自动化等领域。RXTX库是一个流行的开源Java库,用于实现与串行端口(COM口)和并行端口的交互。在本教程中,我们将...

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

    这样,我们就成功地解决了Spring Boot中`InputStream`只能读取一次的问题,使得我们可以多次读取并处理请求数据,无论是用于文件上传、消息解析还是其他需要多次读取的场景。在实际项目中,根据具体需求,可能还需要...

    JAVA串口采集传感器数据

    5. **读写数据**:使用`InputStream`和`OutputStream`进行串口数据的读取和写入。 ```java InputStream in = serialPort.getInputStream(); OutputStream out = serialPort.getOutputStream(); byte[] buffer ...

    java.io.Reader 和 java.io.InputStream 的区别

    `java.io.Reader`和`java.io.InputStream`是Java标准库中处理输入数据的核心类,它们分别针对字符流和字节流提供了基础的支持。 #### `java.io.Reader`:字符流的读取器 `java.io.Reader`是所有字符输入流的超类。...

    Java实现inputstream流的复制代码实例

    在 Java 中,InputStream 是一个抽象类,用于读取字节流。它是 Java IO 体系中最基本的输入流接口。InputStream 的主要方法有: * `read()`:读取一个字节 * `read(byte[] b)`:读取多个字节到字节数组中 * `close...

    读取串口数据,java写的

    总的来说,这个Java串口读取程序是实现与硬件设备之间串行通信的一个实例,通过解析`SerialPortDemo-master`中的代码,我们可以深入了解Java如何与硬件进行串口通信,以及如何处理相关的数据传输问题。在实际应用中...

    Java流(文件读写操作)

    - **输入流**:主要用于从数据源读取数据。输入流只能从中读取数据,而不能向其中写入数据。例如,`FileInputStream`用于从文件中读取字节数据。 - **输出流**:主要用于向目的地写入数据。输出流只能向其中写入数据...

    java 获取json网页数据

    在Java编程中,获取JSON网页数据是常见的任务,特别是在处理Web API或者进行数据抓取时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和高效而广泛被采用。本实例将深入讲解如何使用...

    Java中InputStream类.pdf

    作为抽象类,`InputStream`定义了一系列基本的方法来读取字节数据,这些方法由其子类进行具体实现。`InputStream`的出现是为了提供一个统一的接口,方便开发者处理各种不同类型的输入数据流。 **1. 抽象类与继承...

    java使用Socket类接收和发送数据

    - 获取输入流:同样,通过`Socket`的`getInputStream()`方法获取一个`InputStream`,然后利用`DataInputStream`或`BufferedReader`等类读取服务器返回的数据。 ```java InputStream inputStream = socket....

    java读取sqlserver image字段.docx

    然而,如何有效地从数据库中读取这些二进制数据,并将其转换为可用的格式,如图像文件,则是一个常见的技术问题。本文将详细介绍如何使用Java语言读取SQL Server中的`IMAGE`字段,并将其转换为图片文件。 #### 二、...

    Java解析大数据量Excel,可解析1048576行excel

    2. **迭代读取**: 使用`RowIterator`或`CellIterator`进行迭代读取,而不是一次性获取所有行或所有单元格。这可以避免一次性加载大量数据,尤其是在处理百万行时。 3. **优化内存使用**: 设置适当的内存阈值,例如...

    java读取dlt645所需文件

    如果你的DLL文件包含了读取DLT645数据的原生函数,那么你需要使用这些技术将Java代码与DLL功能关联起来。 3. **Jar包**:Java Archive(JAR)文件是Java平台特有的归档格式,用于打包类文件、资源文件等。如果你的...

    Java字节流数据逐行读取(readLine)

    总结来说,虽然Java的字节流不直接支持`readLine()`方法,但通过结合`InputStreamReader`和`BufferedReader`,我们可以方便地实现字节流数据的逐行读取。在处理文本文件时,正确选择字符编码并确保资源的有效管理是...

    将输出流OutputStream转化为输入流InputStream的方法

    // 从InputStream读取数据 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { System.out.print(new String(buffer, 0, bytesRead)); } } catch (IOException ...

    java 使用socked接收chunck分块数据

    Java的Socket API提供了一个InputStream,我们可以从这个输入流中读取接收到的数据。在chunked模式下,数据被分为多个块,每个块都有一个十六进制的大小前缀,后面跟着块的实际内容,最后是一块大小为0的块表示数据...

    完美解决java读取excel内存溢出问题.rar

    总结来说,解决Java读取Excel内存溢出问题,关键在于合理利用资源、优化代码逻辑以及选择适合的API,如Apache POI的SXSSF。通过这些方法,我们可以在不显著增加系统资源负担的情况下,高效地处理大Excel文件。

    Java应用程序读取图片内容.zip

    在Java编程语言中,读取图片内容是一项常见的任务,尤其在开发图形用户界面(GUI)应用、处理图像数据或进行图像分析时。本教程将详细解释如何使用Java来读取和处理图片。以下是一些核心知识点: 1. **Java Image I...

Global site tag (gtag.js) - Google Analytics