`
chencvgk
  • 浏览: 16768 次
  • 性别: 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)

分享到:
评论

相关推荐

    java InputStream读取数据问题

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

    inputstream读取数据的问题

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

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

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

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

    Springboot读取本地json文件工程

    // 使用InputStream读取数据 } catch (IOException e) { e.printStackTrace(); } ``` 4. **使用Spring的JdbcTemplate和JsonUtils**:如果你的应用使用了Spring Data JPA或其他数据库访问技术,可以结合`...

    java抓取网页三种方式

    在这个示例中,我们使用了 URL 的 openStream() 方法来打开指定的 URL,然后使用 InputStream 读取数据。同时,我们也使用了 OutputStream 来将数据写入到文件中。 知识点: * 使用 URL 连接来抓取网页 * 使用 ...

    Hadoop分布式文件系统——导入和导出数据内含源码以及说明书可以自己运行复现.zip

    2. **使用Hadoop API**:在编程环境下,可以通过FileSystem实例的open方法打开一个文件,然后使用InputStream读取数据,最后写入到本地文件系统。 3. **处理大文件**:对于大文件,可能需要分块读取和写入,避免一...

    基于socket的文件传输

    - 从Socket的InputStream读取数据,并写入FileOutputStream,完成文件接收。 在实际的代码实现中,需要处理异常,确保在网络问题或文件操作失败时能够正确关闭资源。此外,为了提高效率,通常会采用缓冲区进行数据...

    基于Java的源码-二进制IO类与文件复制操作实例.zip

    - 使用read()方法从InputStream读取数据,write()方法将数据写入OutputStream。 - 当read()返回-1表示文件末尾到达,关闭流。 5. **异常处理**:在进行文件操作时,需要捕获并处理可能出现的IOException,例如...

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

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

    android客户端加服务端的socket长连接

    3. 发送消息时,通过OutputStream写出数据,接收消息时,通过InputStream读取数据。 4. 长连接需要保持Socket连接状态,通常会设置心跳机制,定期发送心跳包以检查连接是否正常。 三、客户端对服务器发送消息 1. ...

    android3.0socket通讯实现代码.pdf

    5. **输入/输出流处理**:通过 `BufferedWriter` 和 `OutputStreamWriter` 对象向Socket的OutputStream写入数据,通过 `BufferedReader` 和 `InputStreamReader` 从Socket的InputStream读取数据。 6. **UI交互**:...

    java socket传输各种格式文件

    客户端接收时,通过Socket的InputStream读取数据并保存为文件。 三、实现步骤 1. **服务端**: - 创建ServerSocket,并绑定到特定端口。 - 使用accept()方法等待客户端连接。 - 打开文件,将文件内容读取为字节...

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

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

    android 文件传输 http

    3. **读取数据**:从InputStream读取数据并写入本地文件。 4. **关闭连接**:完成读取后,关闭InputStream和连接。 TCP/IP协议是HTTP的底层基础,负责在网络中可靠地传输数据。TCP是一种面向连接的协议,确保数据按...

    net.rar_socket 文件传输_传文件_文件 传_文件传输

    4. **读取数据**:从Socket的InputStream读取数据,写入本地文件。 ```java byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inFromServer.read(buffer)) != -1) { fos.write(buffer, 0, ...

    java实现文件的复制

    在复制文件时,我们通常从一个InputStream读取数据,然后通过OutputStream写入数据到新的文件中。 传统的文件复制方法是通过BufferedInputStream和BufferedOutputStream实现的,代码示例如下: ```java ...

    BlackBerry Bitmap URL web

    在BlackBerry中,要从URL加载Bitmap,我们需要使用HttpConnection类来建立与远程服务器的连接,然后通过InputStream读取数据。以下是一个基本的步骤: 1. 创建HttpConnection对象,打开到指定URL的连接。这通常涉及...

    Android应用源码安卓与PC的Socket通信项目java版.zip

    - **InputStream/OutputStream**:Socket连接建立后,使用InputStream读取数据,OutputStream写入数据。 3. **Android与PC间的通信流程**: - **TCP/IP协议**:本项目使用TCP协议确保数据的可靠传输,它提供面向...

    socket客户端服务器

    例如,服务器端可能通过PrintWriter向Socket的OutputStream写入数据,客户端则通过BufferedReader从Socket的InputStream读取数据。为了保证数据的完整性和可靠性,通常会采用字节流(如InputStream和OutputStream)...

Global site tag (gtag.js) - Google Analytics