Read方法
Read()
public abstract int read() throws IOException
从(来源)输入流中(读取的内容)读取数据的下一个字节到(去处)java程序内部中
返回值为0到255的int类型的值,返回值为字符的ACSII值(如a就返回97,n就返回110).
如果没有可用的字节,因为已经到达流的末尾, -1返回的值
运行一次只读一个字节,所以经常与while((len = inputstream.read()) != -1)一起使用
read(byte [] b )
public int read(byte[] b) throws IOException
从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中
返回值为实际读取的字节数
运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节
第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度。
如果没有可用的字节,因为已经到达流的末尾, -1返回的值
如果b.length==0,则返回0
read( byte [] b , int off , int len)
public int read(byte[] b, int off, int len, throws IOException)
读取 len字节的数据从输入流到一个字节数组。
试图读取多达 len字节,但可能读取到少于len字节。返回实际读取的字节数为整数。
第一个字节存储读入元素b[off],下一个b[off+1],等等。读取的字节数是最多等于len。k被读取的字节数,这些字节将存储在元素通过b[off+k-1]b[off],离开元素通过b[off+len-1]b[off+k]未受影响。
read(byte[]b)就是相当于read(byte [] b , 0 , b.length).所以两者差不多.性质一样
为什么read()无参方法读取一个字节,返回的是一个int类型,而不是一个byte类型?
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111(文件的底层按补码来存储的)
blob.png
那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型