InputStream类中的三种read方法

InputStream类以及子类中的Read方法

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).所以两者差不多.性质一样

InputStream类中的三种read方法


为什么read()无参方法读取一个字节,返回的是一个int类型,而不是一个byte类型?

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111(文件的底层按补码来存储的)

InputStream类中的三种read方法

那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型