`
lushuaiyin
  • 浏览: 705317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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()方法才能将数据总数全部得到。
如果这样写代码:
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读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...

    inputstream读取数据的问题

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

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

    当我们尝试从`InputStream`读取数据时,数据会被逐个字节地读取并移动流的位置,一旦读取,这些字节就不会再回到流的开头。因此,如果需要多次读取,我们需要找到一种方式来复用或复制流中的数据。 在Spring Boot中...

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

    在处理大文件或网络流时,可能需要分多次读取数据。每次读取都会得到一个`byte[]`,我们需要将这些数组合并。以下是一个合并`byte[]`的例子: ```java public byte[] mergeByteArrays(List[]&gt; byteArrays) { int ...

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

    最后,你需要在一个循环中读取数据并处理它,直到应用程序结束或串口关闭: ```java byte[] buffer = new byte[1024]; while (true) { int n = in.read(buffer); if (n &gt; 0) { String receivedData = new String...

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

    1. **多线程**:为了提高程序效率,可以使用多线程,让一个线程负责读取数据,另一个线程负责处理接收到的数据,从而避免阻塞主线程。 2. **非阻塞I/O**:Java NIO(New IO)提供了非阻塞I/O操作,通过选择器...

    将输出流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写的

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

    BufferedInputStream 比 InputStream 性能点(实验数据报告)

    当使用BufferedInputStream读取数据时,它实际上是从缓冲区中读取数据,而不是直接从底层数据源。缓冲区会预加载一定数量的数据(默认情况下是8192字节),只有当缓冲区数据读取完毕时,才会再次从底层数据源加载...

    Java中InputStream类.pdf

    例如,`FileInputStream`可以从文件系统读取数据,`SocketInputStream`可以从网络连接读取数据。在处理这些数据流时,可以利用`InputStream`提供的方法进行读取、跳过、标记和重置操作。 总结,`InputStream`在Java...

    Java流(文件读写操作)

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

    Android开发之读取Excel表格数据

    本篇文章将详细讲解如何在Android环境中直接读取资源文件夹下的Excel表格数据,为你的应用提供便捷的数据处理能力。 首先,理解Android的资源文件夹结构是至关重要的。在Android Studio项目中,我们通常把静态的非...

    Android读取本地json文件的方法(解决显示乱码问题)

    在Android应用开发中,有时我们需要从本地存储的JSON文件中读取数据,这通常涉及到文件I/O操作和字符编码处理。以下将详细讲解如何在Android中读取本地JSON文件,并解决可能出现的显示乱码问题。 1. **读取本地JSON...

    java读取pc串口数据

    创建一个输入流`InputStream`来读取串口数据,然后使用循环不断读取。例如: ```java InputStream input = serialPort.getInputStream(); byte[] buffer = new byte[1024]; int read; while ((read = input....

    使用Poi读取大数据量excel的方法

    此外,为了提高性能,还可以考虑使用多线程并行处理多个sheet,或者在读取过程中进行数据过滤和预处理,避免不必要的计算。 总之,Apache POI结合SAX API为在Android上处理大数据量Excel文件提供了有效方案,通过...

    EXCEL文件上传读取数据

    从给定的文件信息来看,我们正在探讨的主题是“EXCEL文件上传读取数据”,这是一个在Web开发中常见的需求,特别是在处理大量数据导入时。下面将深入解析这一知识点,包括其实现原理、技术栈的选择以及具体步骤。 ##...

    raw文件数据读取

    总结:在Android应用中,无论是从`res/raw`还是`assets`目录读取数据,都需要通过`InputStream`进行操作。RAW文件适用于已知格式的资源,而ASSETS目录则更灵活,适合存放任意类型的文件。了解这两种方法,可以帮助...

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

    5. **`Socket`和`URLConnection`**:虽然它们本身不是`InputStream`的直接子类,但通过调用`getInputStream()`方法,可以从网络套接字或URL连接读取数据。 #### 总结 综上所述,`java.io.Reader`和`java.io....

    原理讲解-ServletInputStream.readLine(byte[] b, int off, int len) 方法

    这个方法在处理文本数据时非常有用,因为它可以方便地按行读取数据,而不仅仅是单个字节。 在描述的场景中,我们看到一个文件上传的例子,涉及到两个 JSP 页面:`inputtest.jsp` 和 `accept.jsp`。`inputtest.jsp` ...

    INPUTSTREAM

    1. **FileInputStream** - 用于从文件系统中读取数据。 2. **BufferedInputStream** - 提供缓冲功能,提高数据读取性能。 3. **DataInputStream** - 支持基本数据类型的读取,如 int、float 等。 4. **...

Global site tag (gtag.js) - Google Analytics