在本教程中,我们将借助示例学习Java ByteArrayInputStream及其方法。
java.io包的ByteArrayInputStream类可用于读取输入数据数组(以字节为单位)。
它继承了InputStream抽象类。
注意:在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类为InputStream类中提供的不同方法提供实现。
read() - 从输入流中存在的数组中读取单个字节
read(byte[] array) - 从输入流中读取字节并存储在指定的数组中
read(byte[] array, int start, int length) - 从流中读取等于length的字节数,并从位置start开始存储在指定的数组中
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()方法。例如,
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
在以上示例中,
我们已经使用该available()方法检查输入流中可用字节的数量。
然后,我们使用该read()方法2次从输入流中读取2个字节。
现在,在读取2个字节之后,我们检查了可用字节。这次,可用字节减少了2。
要丢弃和跳过指定的字节数,可以使用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()方法在ByteArrayInputStream类中不起作用。即使在close()方法被调用之后,我们也可以使用该类的方法。
方法 | 内容描述 |
---|---|
finalize() | 确保close()方法被调用 |
mark() | 标记输入流中已读取数据的位置 |
reset() | 将控件返回到输入流中设置了标记的点 |
markSupported() | 检查输入流是否支持mark()和reset() |