文章目录

  • read()
  • read(byte [] b )
  • read( byte [] b , int off , int len)
  • 代码示例
  • 为什么read()无参方法读取一个字节,返回的是一个int类型,而不是一个byte类型?



在Java8中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。


查阅Java8 API,我们可以看到,在InputStream中定义了三个重载的read()方法:


java read 的方法 java中read方法_数据结构


但是在这三个方法中,只有参数列表为空的read方法定义为抽象方法,这也就意味着在直接继承自InputStream的所有子类中,必须重写这个方法.

read()

首先我们来看这个没有参数的read方法,从(来源)输入流中(读取的内容)读取数据的下一个字节到(去处)java程序内部中,返回值为0到255的int类型的值,返回值为字符的ASCII值(如a就返回97,n就返回110).如果没有可用的字节,因为已经到达流的末尾, -1返回的值,运行一次只读一个字节,所以经常与while((len = inputstream.read()) != -1)一起使用.

read(byte [] b )

从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数,运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度.如果没有可用的字节,因为已经到达流的末尾, -1返回的值 ,如果b.length==0,则返回0.

read( byte [] b , int off , int len)

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

代码示例

package com.yiibai;

import java.io.FileInputStream;
import java.io.InputStream;

public class InputStreamDemo {
   public static void main(String[] args) throws Exception {
      
      InputStream is = null;
      byte[] buffer=new byte[5];
      char c;
      
      try{
         // 文本内容为 ABCDE
         is = new FileInputStream("C://test.txt");
         // 这个2指的是数据偏移 不是流偏移 将读取的字节添加到字节数组buffer中
         is.read(buffer, 2, 3);
         // 循环字节数据
         for(byte b:buffer){
            if(b==0)
               // 因为偏移了2个单位,又因为数组默认值为0,所以前面2个单位是没有的
               c='-';
            else
               // 这里是读到的字节
               c=(char)b;
            System.out.print(c);
         }
      }catch(Exception e){
         e.printStackTrace();
      }finally{
         if(is!=null)
            is.close();
      }
   }
}

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

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,一个字节是8个二进制,也就是说我们实际read完后得到的是这样的东西(11111110,00001010),如果每次读取都返回byte,有可能在读到中间的时候遇到111111111(文件的底层按补码来存储的),那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型