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;
}
}