Java 菜鸟教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java ByteArrayInputStream 类

在本教程中,我们将借助示例学习Java ByteArrayInputStream及其方法。

java.io包的ByteArrayInputStream类可用于读取输入数据数组(以字节为单位)。

它继承了InputStream抽象类。

ByteArrayInputStream是Java InputStream的子类。

注意:在ByteArrayInputStream中,使用字节数组创建输入流。 它包括一个内部数组,用于存储该特定字节数组的数据。

创建一个ByteArrayInputStream

为了创建字节数组输入流,我们必须首先导入java.io.ByteArrayInputStream包。导入包后,就可以创建输入流。

//创建一个ByteArrayInputStream来读取整个数组
ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr);

在这里,我们创建了一个输入流,该输入流从arr数组中读取整个数据。但是,我们也可以创建仅从数组读取一些数据的输入流。

//创建一个ByteArrayInputStream来读取数组的一部分
ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr, int start, int length);

在这里,输入流从数组的start位置开始读取等于数组length的字节数。

ByteArrayInputStream的方法

ByteArrayInputStream类为InputStream类中提供的不同方法提供实现。

read()方法

  • read()  - 从输入流中存在的数组中读取单个字节

  • read(byte[] array)  - 从输入流中读取字节并存储在指定的数组中

  • read(byte[] array, int start, int length) - 从流中读取等于length的字节数,并从位置start开始存储在指定的数组中

示例:ByteArrayInputStream读取数据

import java.io.ByteArrayInputStream;

public class Main {
  public static void main(String[] args) {

    //创建一个字节数组
    byte[] array = {1, 2, 3, 4};

    try {
      ByteArrayInputStream input = new ByteArrayInputStream(array);

      System.out.print("从输入流读取的字节: ");

      for(int i= 0; i < array.length; i++) {

        //读取字节
        int data = input.read();
        System.out.print(data + ", ");
      }
      input.close();
    }

    catch(Exception e) {
      e.getStackTrace();
    }
  }
}

输出结果

从输入流读取的字节: 1, 2, 3, 4,

在上面的示例中,我们创建了一个名为input的字节数组输入流。

ByteArrayInputStream input = new ByteArrayInputStream(array);

在此,输入流包括来自指定数组的所有数据。为了从输入流中读取数据,我们使用了read()方法。

available()方法

要获取输入流中可用字节的数量,我们可以使用available()方法。例如,

import java.io.ByteArrayInputStream;

public class Main {

  public static void main(String args[]) {

    //创建字节数组
    byte[] array = { 1, 2, 3, 4 };

    try {
      ByteArrayInputStream input = new ByteArrayInputStream(array);

      //返回可用的字节数
      System.out.println("开始时的可用字节数: " + input.available());

      //从输入流中读取两个字节
      input.read();
      input.read();

      //返回可用的字节数
      System.out.println("结束时的可用字节数: " + input.available());

      input.close();
    }

    catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出结果

开始的可用字节数: 4
结束时的可用字节数: 2

在以上示例中,

  1. 我们已经使用该available()方法检查输入流中可用字节的数量。

  2. 然后,我们使用该read()方法2次从输入流中读取2个字节。

  3. 现在,在读取2个字节之后,我们检查了可用字节。这次,可用字节减少了2。

skip()方法

要丢弃和跳过指定的字节数,可以使用skip()方法。例如

import java.io.ByteArrayInputStream;

public class Main {

  public static void main(String args[]) {

    //创建一个字节数组
    byte[] array = { 1, 2, 3, 4 };
    try {
      ByteArrayInputStream input = new ByteArrayInputStream(array);

      //使用skip()方法
      input.skip(2);
      System.out.print("跳过2个字节后的输入流: ");

      int data = input.read();
      while (data != -1) {
        System.out.print(data + ", ");
        data = input.read();
      }

      // close() 方法
      input.close();
    }

    catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出结果

跳过2个字节后的输入流: 3, 4,

在上面的示例中,我们使用skip()方法跳过输入流中的2字节数据。因此,不会从输入流中读取1和2。

close()方法

要关闭输入流,可以使用close()方法。

但是,close()方法在ByteArrayInputStream类中不起作用。即使在close()方法被调用之后,我们也可以使用该类的方法。

ByteArrayInputStream的其他方法

方法内容描述
finalize()确保close()方法被调用
mark()标记输入流中已读取数据的位置
reset()将控件返回到输入流中设置了标记的点
markSupported()检查输入流是否支持mark()和reset()