原文: https://www.programiz.com/java-programming/bytearrayinputstream

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

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

它扩展了InputStream抽象类。

Java `ByteArrayInputStream`类 - 图1

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


创建一个ByteArrayInputStream

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

  1. // Creates a ByteArrayInputStream that reads entire array
  2. ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr);

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

  1. // Creates a ByteArrayInputStream that reads a portion of array
  2. 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读取数据

  1. import java.io.ByteArrayInputStream;
  2. public class Main {
  3. public static void main(String[] args) {
  4. // Creates an array of byte
  5. byte[] array = {1, 2, 3, 4};
  6. try {
  7. ByteArrayInputStream input = new ByteArrayInputStream(array);
  8. System.out.print("The bytes read from the input stream: ");
  9. for(int i= 0; i < array.length; i++) {
  10. // Reads the bytes
  11. int data = input.read();
  12. System.out.print(data + ", ");
  13. }
  14. input.close();
  15. }
  16. catch(Exception e) {
  17. e.getStackTrace();
  18. }
  19. }
  20. }

输出

  1. The bytes read from the input stream: 1, 2, 3, 4,

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

  1. ByteArrayInputStream input = new ByteArrayInputStream(array);

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


available()方法

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

  1. import java.io.ByteArrayInputStream;
  2. public class Main {
  3. public static void main(String args[]) {
  4. // Creates an array of bytes
  5. byte[] array = { 1, 2, 3, 4 };
  6. try {
  7. ByteArrayInputStream input = new ByteArrayInputStream(array);
  8. // Returns the available number of bytes
  9. System.out.println("Available bytes at the beginning: " + input.available());
  10. // Reads 2 bytes from the input stream
  11. input.read();
  12. input.read();
  13. // Returns the available number of bytes
  14. System.out.println("Available bytes at the end: " + input.available());
  15. input.close();
  16. }
  17. catch (Exception e) {
  18. e.getStackTrace();
  19. }
  20. }
  21. }

输出

  1. Available bytes at the beginning: 4
  2. Available bytes at the end: 2

在上面的示例中,

  1. 我们已经使用available()方法检查输入流中的可用字节数。
  2. 然后,我们使用read()方法 2 次,从输入流中读取 2 个字节。
  3. 现在,在读取 2 个字节后,我们检查了可用字节。 这次,可用字节减少了 2。

skip()方法

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

  1. import java.io.ByteArrayInputStream;
  2. public class Main {
  3. public static void main(String args[]) {
  4. // Create an array of bytes
  5. byte[] array = { 1, 2, 3, 4 };
  6. try {
  7. ByteArrayInputStream input = new ByteArrayInputStream(array);
  8. // Using the skip() method
  9. input.skip(2);
  10. System.out.print("Input stream after skipping 2 bytes: ");
  11. int data = input.read();
  12. while (data != -1) {
  13. System.out.print(data + ", ");
  14. data = input.read();
  15. }
  16. // close() method
  17. input.close();
  18. }
  19. catch (Exception e) {
  20. e.getStackTrace();
  21. }
  22. }
  23. }

输出

  1. Input stream after skipping 2 bytes: 3, 4,

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


close()方法

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

但是,close()方法在ByteArrayInputStream类中无效。 即使调用了close()方法,我们也可以使用此类的方法。


ByteArrayInputStream的其他方法

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

要了解更多信息,请访问 Java ByteArrayInputStream(Java 官方文档)