现在的位置: 首页 > 综合 > 正文

三个read方法区别

2013年03月01日 ⁄ 综合 ⁄ 共 1628字 ⁄ 字号 评论关闭

read(byte[] b)与read(byte[] b)的区别
2009-08-03 18:39
BufferedInputStream类有三个read方法

public int read()
         throws IOException
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。如果因为已经到达流末

尾而没有字节可用,则返回 -1。在输入数据可用、检测到流末尾或抛出异常之前,此方法将一直阻塞。
此方法只执行 in.read() 并返回结果。

指定者:
类 InputStream 中的 read
返回:
下一个数据字节;如果已到达流末尾,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
public int read(byte[] b,int off,int len)throws IOException
从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。
此方法实现了 InputStream 类相应 read 方法的常规协定。另一个便捷之处在于,它将通过重复地调用

底层流的 read 方法,尝试读取尽可能多的字节。这种迭代的 read 会一直继续下去,直到满足以下条

件之一:

已经读取了指定的字节数,
底层流的 read 方法返回 -1,指示文件末尾(end-of-file),或者
底层流的 available 方法返回 0,指示将阻塞后续的输入请求。
如果第一次对底层流调用 read 返回 -1(指示文件末尾),则此方法返回 -1。否则此方法返回实际读

取的字节数。
鼓励(但不是必须)此类的各个子类以相同的方式尝试读取尽可能多的字节。

覆盖:
类 FilterInputStream 中的 read
参数:
b - 目标缓冲区。
off - 开始存储字节处的偏移量。
len - 要读取的最大字节数。
返回:
读取的字节数;如果已到达流末尾,则返回 -1。
抛出:
IOException - 如果已经调用其 close() 方法关闭了此输入流,或者发生 I/O 错误
public int read(byte[] b) throws IOException

从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中。在某些输入可用之前,此方法将阻

塞。

此方法只执行 read(b, 0, b.length) 调用并返回结果。注意到它不 执行 in.read(b) 很重要;

FilterInputStream 的某些子类依赖于实际使用的实现策略。

覆盖:

类 InputStream 中的 read

参数:

b - 存储读取数据的缓冲区。

返回:

读入缓冲区的字节总数,如果因为已经到达流末尾而没有更多的数据,则返回 -1。

抛出:

IOException - 如果发生 I/O 错误。

另请参见:

read(byte[], int, int)

这时注意了:
read(byte[] b,int off,int len)是重复调用read()方法从给定偏移量处开始(一般为0)尝试读取尽

可能多的字节,最多能读取的字节数由len指定,并返回实际的读取字节数,在读取过程中,如果遇到文

件末尾则返回-1.
read(byte[] b)函数则调用的是read(byte[] b,int off,int len)函数,同时将b,0,b.length做为参数

传递给read(byte[] b,int off,int len)函数。这个函数没有调用read()函数重复读取。
他们的区别在于read(byte[] b,int off,int len)灵活的指定偏移量开始处,指定长度,read(byte[] 

b)则指定的固定的偏移量与长度,他们最重要的是read(byte[] b,int off,int len)调用的是read()方

法重复完成读取输入流,read(byte[] b)是调用的read(byte[] b,int off,int len)函数读取输入流。
我没有看源码,只是从API中找到他们的区别所以只能总结到这么深,也是给自己留个笔记。
我碰到的问题在write(byte[] b)与write(byte[] b,int off,int len)上。

抱歉!评论已关闭.