InputStreamReader.read()详解
在最一开始,我们先明确InputStreamReader和InputStream的区别:InputStreamReader用于读取字符,而InputStream用于读取字节
public abstract int read() throws IOException
从输入流中读取数据的一个字符(可以从中读入一个字节序列的对象称为输入流,这些字节序列可以来自文件、网络、内存块)。
以整数的形式返回读入的这个字符(其实就是ASC码) ,也就是一个0-255的整数。
如果已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
public int read(byte[] cbuf, int offset, int length) throws IOException
将输入流中最多 length个字符读入 byte 数组(缓冲区)。尝试读取 length 个字符,但读取的字节也可能小于该值。
以整数形式返回实际读取的字符数 。
如果已经到达流末尾而没有可用的字符,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
如果 len 为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字符。如果因为流位于文件末尾而没有可用的字字符,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。
将读取的第一个字节存储在元素 b[offset] 中,下一个存储在 b[off+1] 中,依次类推。读取的字符数最多等于 length。设 k 为实际读取的字节数,这些字节将存储在 b[offset] 到 b[off+k-1] 的元素中,不影响 b[off+k] 到 b[off+len-1]的元素。
在任何情况下,b[0]到b[off]的元素以及b[off+len]到b[b.length-1]的元素都不会受到影响。
此方法重复调用方法 read()。如果第一次这样的调用导致 IOException,则从对 read(cbuf, offset, length) 方法的调用中返回该异常。如果对 read()的任何后续调用导致IOException,则捕获该异常并将其视为到达文件末尾;到达该点时读取的字符存储在 cbuf 中,并返回发生异常之前读取的字节数。在已读取输入数据len的请求数量、检测到文件结束标记、抛出异常前,此方法的默认实现将一直阻塞。建议子类提供此方法更为有效的实现。