`

InputStream读数据

阅读更多
关于InputStream读取数据的问题,在网上看到的一篇文章,这里摘抄过来。对于不知道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)
分享到:
评论

相关推荐

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

    然而,`InputStream`的设计是按顺序读取字节流,一旦流被读取,数据就会被消耗掉,无法再次读取。这在处理需要多次解析或持久化输入流内容的场景下会带来困扰。本篇文章将详细讲解如何在Spring Boot应用中解决`...

    Socket中InputStream的read方法的阻塞特性

    阻塞I/O是指当调用`read`方法时,如果数据没有准备好,那么该方法会暂停执行,直到有数据可读才会继续。这就像我们在等待一个门打开,门没开时我们无法通过,只能在那里等待。这种方式简单直观,但可能导致程序在...

    读取串口数据,java写的

    3. **数据接收**:通过创建一个`InputStream`对象,监听串口的输入数据流。可以设置一个循环,不断从输入流中读取字节,转换成字符串,从而获取串口接收到的数据。 4. **数据发送**:创建一个`OutputStream`对象,...

    Java流(文件读写操作)

    - **处理流**:也称为高级流,它们不直接与数据源交互,而是构建在已存在的流之上,为这些流提供额外的功能或服务,如数据转换、过滤或缓冲等。例如`BufferedReader`和`BufferedWriter`是在`Reader`和`Writer`基础上...

    数据流读与写操作手册

    - 字节流:Java的`InputStream`和`OutputStream`类族构成了字节流,它们处理单个字节的数据。字节流适用于处理二进制数据,如图片、音频文件等。字节流包括输入流和输出流,如`FileInputStream`和`FileOutputStream...

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

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

    Android开发,Socket Client端和Socket Server端数据发送和接收

    - **关闭资源**:在完成数据交换后,应关闭Socket、InputStream和OutputStream,避免资源浪费。 9. **示例代码** - Server端示例: ```java ServerSocket serverSocket = new ServerSocket(12345); Socket ...

    Java数据流介绍Java数据流介绍

    字节流处理以字节为单位的数据,主要包括InputStream和OutputStream两大类。InputStream是所有输入字节流的基类,提供了一系列的方法来读取字节数据。例如,`read()`方法用于读取单个字节,返回一个int值;`read...

    javaSocket的Tcp通信方式两个线程,一个线程接收数据一个线程发送数据

    1. **阻塞**:如果线程正在接收数据,而此时没有数据可读,那么线程将被阻塞,无法执行其他任务,如发送数据。 2. **并发性不足**:如果发送和接收操作都在同一线程中,当需要同时进行时,可能无法充分利用系统资源...

    Java输入数据流详解

    5. `available()`: 返回可以立即读取的字节数,用于判断是否还有数据可读。 由于字节流处理单字节的方式不适用于Unicode字符,Java引入了字符流,这些类派生自`Reader`和`Writer`抽象类。字符流用于处理双字节的...

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

    当`readLine()`返回null时,表示已读到文件末尾。 在处理多语言或者特殊字符的文本时,选择正确的字符编码非常重要,因为不同的编码方式对字符的表示不同,错误的编码可能导致乱码。例如,如果你知道文件使用的是...

    Java处理100万行超大Excel文件秒级响应

    - **性能要求:** 在合理的时间内完成数据处理任务,例如本案例中的104万行20列数据能够在70秒内处理完毕。 #### 二、技术选型与原理介绍 在尝试了JXL和POI等传统库之后,最终选择了阿里开源的EasyExcel库来解决这...

    通过JDK源码学习InputStream详解

    这三个read方法都是阻塞的,即它们会一直等待直到有数据可读,或者遇到流的末尾,或者抛出异常。对于`read(byte b[], int off, int len)`方法,如果len为0,将立即返回0,表示没有读取任何字节。如果输入流已经关闭...

    java_io详解

    其中,`InputStream`用于读取数据,而`OutputStream`用于写入数据。 ##### 5.1 `InputStream`类 `InputStream`类及其子类用于读取字节数据。以下是一些常见的`InputStream`子类及其用途: - **`...

    _Java数据流.ppt

    例如,`read()` 方法返回一个整数值表示读取的字节,如果没有更多数据可读则返回 -1。`read(byte[] b)` 方法读取多个字节并存储到提供的字节数组中,而 `read(byte[] b, int off, int len)` 允许指定读取的起始位置...

    数据流和多线程笔记

    这通常涉及到`java.io.File`类和其他相关类,比如`InputStream`、`OutputStream`等。 - **`java.io.File`类**:用于封装文件和目录的信息,可以用来获取文件的一些基本信息,比如文件是否存在、文件的大小、创建...

    Java+MySql图片数据保存与读取的具体实例

    在Java和MySQL的应用开发中,图片数据的存储和读取是一项常见的需求,特别是在构建网站、电商系统或社交应用时。本实例将详细讲解如何利用Java作为客户端,与MySQL数据库进行交互,实现图片数据的保存与读取。 首先...

    物联网 Android 通过串口服务器获取zigbee上数据

    2. **数据收发**:使用`InputStream`读取服务器发送的数据,`OutputStream`用于向服务器发送控制指令或响应。数据可能需要解码,例如从字节流转换为字符串,然后根据Zigbee协议解析。 3. **数据解析**:解析Zigbee...

    android 读、写串口

    - **读取数据**:通过InputStream的read方法接收数据,可能需要异步处理,因为read方法是阻塞式的。 ```java InputStream inputStream = serialPort.getInputStream(); byte[] buffer = new byte[1024]; int ...

Global site tag (gtag.js) - Google Analytics