关于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)
分享到:
相关推荐
然而,`InputStream`的设计是按顺序读取字节流,一旦流被读取,数据就会被消耗掉,无法再次读取。这在处理需要多次解析或持久化输入流内容的场景下会带来困扰。本篇文章将详细讲解如何在Spring Boot应用中解决`...
阻塞I/O是指当调用`read`方法时,如果数据没有准备好,那么该方法会暂停执行,直到有数据可读才会继续。这就像我们在等待一个门打开,门没开时我们无法通过,只能在那里等待。这种方式简单直观,但可能导致程序在...
3. **数据接收**:通过创建一个`InputStream`对象,监听串口的输入数据流。可以设置一个循环,不断从输入流中读取字节,转换成字符串,从而获取串口接收到的数据。 4. **数据发送**:创建一个`OutputStream`对象,...
- **处理流**:也称为高级流,它们不直接与数据源交互,而是构建在已存在的流之上,为这些流提供额外的功能或服务,如数据转换、过滤或缓冲等。例如`BufferedReader`和`BufferedWriter`是在`Reader`和`Writer`基础上...
- 字节流:Java的`InputStream`和`OutputStream`类族构成了字节流,它们处理单个字节的数据。字节流适用于处理二进制数据,如图片、音频文件等。字节流包括输入流和输出流,如`FileInputStream`和`FileOutputStream...
Java 读取串口数据是Java编程中一个重要的部分,特别是在物联网(IoT)设备通信、嵌入式系统以及工业自动化等领域。RXTX库是一个流行的开源Java库,用于实现与串行端口(COM口)和并行端口的交互。在本教程中,我们将...
- **关闭资源**:在完成数据交换后,应关闭Socket、InputStream和OutputStream,避免资源浪费。 9. **示例代码** - Server端示例: ```java ServerSocket serverSocket = new ServerSocket(12345); Socket ...
字节流处理以字节为单位的数据,主要包括InputStream和OutputStream两大类。InputStream是所有输入字节流的基类,提供了一系列的方法来读取字节数据。例如,`read()`方法用于读取单个字节,返回一个int值;`read...
1. **阻塞**:如果线程正在接收数据,而此时没有数据可读,那么线程将被阻塞,无法执行其他任务,如发送数据。 2. **并发性不足**:如果发送和接收操作都在同一线程中,当需要同时进行时,可能无法充分利用系统资源...
5. `available()`: 返回可以立即读取的字节数,用于判断是否还有数据可读。 由于字节流处理单字节的方式不适用于Unicode字符,Java引入了字符流,这些类派生自`Reader`和`Writer`抽象类。字符流用于处理双字节的...
当`readLine()`返回null时,表示已读到文件末尾。 在处理多语言或者特殊字符的文本时,选择正确的字符编码非常重要,因为不同的编码方式对字符的表示不同,错误的编码可能导致乱码。例如,如果你知道文件使用的是...
- **性能要求:** 在合理的时间内完成数据处理任务,例如本案例中的104万行20列数据能够在70秒内处理完毕。 #### 二、技术选型与原理介绍 在尝试了JXL和POI等传统库之后,最终选择了阿里开源的EasyExcel库来解决这...
这三个read方法都是阻塞的,即它们会一直等待直到有数据可读,或者遇到流的末尾,或者抛出异常。对于`read(byte b[], int off, int len)`方法,如果len为0,将立即返回0,表示没有读取任何字节。如果输入流已经关闭...
其中,`InputStream`用于读取数据,而`OutputStream`用于写入数据。 ##### 5.1 `InputStream`类 `InputStream`类及其子类用于读取字节数据。以下是一些常见的`InputStream`子类及其用途: - **`...
例如,`read()` 方法返回一个整数值表示读取的字节,如果没有更多数据可读则返回 -1。`read(byte[] b)` 方法读取多个字节并存储到提供的字节数组中,而 `read(byte[] b, int off, int len)` 允许指定读取的起始位置...
这通常涉及到`java.io.File`类和其他相关类,比如`InputStream`、`OutputStream`等。 - **`java.io.File`类**:用于封装文件和目录的信息,可以用来获取文件的一些基本信息,比如文件是否存在、文件的大小、创建...
在Java和MySQL的应用开发中,图片数据的存储和读取是一项常见的需求,特别是在构建网站、电商系统或社交应用时。本实例将详细讲解如何利用Java作为客户端,与MySQL数据库进行交互,实现图片数据的保存与读取。 首先...
2. **数据收发**:使用`InputStream`读取服务器发送的数据,`OutputStream`用于向服务器发送控制指令或响应。数据可能需要解码,例如从字节流转换为字符串,然后根据Zigbee协议解析。 3. **数据解析**:解析Zigbee...
- **读取数据**:通过InputStream的read方法接收数据,可能需要异步处理,因为read方法是阻塞式的。 ```java InputStream inputStream = serialPort.getInputStream(); byte[] buffer = new byte[1024]; int ...