IO流的读取

本文深入探讨Java InputStream API的使用方法,特别是read方法在处理输入流时的实现细节和注意事项。通过实例展示如何在读取过程中避免数据丢失,特别是在网络编程场景下确保数据完整性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


int java.io.InputStream.read(byte[] b, int off, int len) throws IOException


[i][b]API说明:[/b][/i]
将输入流中最多 len 个数据字节读入字节数组。尝试读取多达 len 字节,但可能读取较少数量。以整数形式返回实际读取的字节数。
在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。

参数:
b - 读入数据的缓冲区。
off - 在其处写入数据的数组 b 的初始偏移量。
len - 要读取的最大字节数。
返回:
读入缓冲区的总字节数,如果由于已到达流末尾而不再有数据,则返回 -1。

注意点:
(1)该方法并不能保证一定能读取到len个长度,它只能保证最多读取到len个长度。尤其是网络编程时,InputStream不能保证一次读取到所有数据,有可能其他数据还在传输中。

根据api的说法执行read操作的时候会先锁定inputStream,直到调用available()得到inputStream长度的时 候才会继续read操作,而当通过网络获取inputStream时,数据不是一次获取到,available()方法返回的有可能并不是全部数据的长 度,而是已获取的数据长度,举个例子:如果数据总长度是1024字节,通过网络获取inputStream,当执行available()时,可能只获取 了100个字节,而如果byte[] 定义了200个字节长度,就会出现读不满的情况!

以下是正确的一个例子:

byte[] buffer = new byte[bufferSize];
InputStream in = socket.getInputStream();
int read = 0;
int offset = 0;
while ((read = in.read(buffer, offset, bufferSize-offset)) != -1) {
if (read > 0) {
offset+=read;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值