Read的三种方法
API reference: https://docs.oracle.com/javase/7/docs/api/
Read()
- 返回int值,0-255。
- 每次从数据源读取一个byte并返回。
read方法每次读取8个二进制位(所谓一个byte字节。字节是十进制0-255之间的一个整数),所以read就是从数据源读取一个8位二进制数(一个byte),将这个byte转换为十进制整数然后返回)。
Read(byte[] b)
- 返回int值,表示读取的字节数。
- 使用一个byte的数组作为一个缓冲区,每次从数据源中读取和缓冲区大小(二进制位)相同的数据并将其存在缓冲区中。
- 第一个字节会被存至b[0]中,下一个存至b[1],以此类推。总字节读取数将等于b的长度,且一个k字节的数据流将被保存在b[0]到b[k-1]中。在这一轮读取中 b[k] -b[b.length-1]将不会收到影响。
注:虽然我们可以指定缓冲区的大小,但是read方法在读取数据的时候仍然是按照字节来读取的。在utf-8等变长编码中,一个复杂字符(比如汉字)所占字节往往大于1,并且长度往往是不固定的。按照字节读取数据会将字符割裂,这就导致我们在使用read(byte[] b)方法读取文件时,虽然指定了缓冲区的大小,但是仍然会出现乱码。
Read(byte[] b, int off, int len)
- 从inputstream读取最多len个字节存至b。返回int,表示实际读取的字节数。
- 第一个字节会被存至b[off]中,下一个存至b[off+1],以此类推。总字节读取数将等于len的长度,且一个k字节的数据流将被保存在b[off]到b[off+k-1]中。在这一轮读取中 b[off+k] - b[off+len-1]将不会收到影响。
- In every case, b[0] - b[off] 和 b[off+len] - b[b.length-1]的元素不会受到影响.
注:len不能随意往大了取,异常:IndexOutOfBoundsException - If off is negative, len is negative, or len is greater than b.length - off。