在 Java IO 中,ByteArrayOutputStream 类能让你把写入流的数据以字节数组的形式捕获并留存。具体而言,你可以将数据持续写入 ByteArrayOutputStream 实例中,待写入操作全部完成后,只需调用该实例的 toByteArray() 方法,就能得到一个包含所有已写入数据的字节数组。
ByteArrayOutputStream 在特定的编程场景中发挥着不可替代的作用。当某个组件的设计是将数据输出到 OutputStream,但你在实际应用中却需要将这些数据以字节数组的形式存储或处理时,ByteArrayOutputStream 就成了你的得力助手,它能高效地完成数据从流到字节数组的转换。
下面是一个简单的 ByteArrayOutputStream 示例:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 将数据写入 ByteArrayOutputStream //... // 将 ByteArrayOutputStream 中的数据转换成字节数组 byte[] bytes = byteArrayOutputStream.toByteArray();
ByteArrayOutputStream 类有以下两种构造方法:
ByteArrayOutputStream() 创建一个新的 ByteArrayOutputStream 对象,其内部缓冲区的初始大小为 32 字节。随着数据写入,若缓冲区空间不足,会自动进行扩容。
ByteArrayOutputStream(int size) 创建一个新的 ByteArrayOutputStream 对象,并指定其内部缓冲区的初始大小为 size 字节。若 size 为负数,会抛出 IllegalArgumentException 异常。使用该构造方法可根据预估的数据量预先分配合适的空间,减少自动扩容次数,提高性能。
下面是创建 ByteArrayOutputStream 实例的方法:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
由于 ByteArrayOutputStream 类继承自 OutputStream 类。因此您可以使用与 OutputStream 相同的 write() 方法将字节写入该类。以下是两个常用的写入方法:
write(int byteToWrite) 此方法用于向 ByteArrayOutputStream 中写入一个字节的数据。参数 byteToWrite 是一个整数,它代表要写入的字节。尽管参数类型为整数,但实际上只有低 8 位会被写入流中。在调用该方法时,会将指定的字节追加到 ByteArrayOutputStream 的内部缓冲区末尾。
write(byte[] bytesToWrite, int offset, int length) 该方法允许你将字节数组中的一部分数据写入 ByteArrayOutputStream。具体来说,bytesToWrite 是包含要写入数据的字节数组,offset 表示从字节数组的哪个位置开始读取数据,length 则指定了要读取的字节数量。通过这种方式,你可以灵活地选择要写入的字节范围,而不必一次性将整个字节数组写入流中。
通过这两个方法,你可以方便地将不同形式的字节数据写入 ByteArrayOutputStream,满足各种数据处理和存储的需求。
完成向 ByteArrayOutputStream 的写入后,您可以使用 ByteArrayOutputStream 的 toByteArray() 方法以 Java 字节数组的形式获取所有写入的字节。
toByteArray() 方法的主要功能是创建一个新分配的字节数组。这个数组的长度是当前 ByteArrayOutputStream 对象中缓冲区的当前大小,并且它会包含该缓冲区中的全部有效数据副本。简单来说,就是把 ByteArrayOutputStream 中存储的所有数据以字节数组的形式提取出来。
示例如下:
byte[] bytes = byteArrayOutputStream.toByteArray();
作为 OutputStream 的子类,ByteArrayOutputStream 也有 close() 方法。但调用 close() 方法对字节数组输出流没有任何影响。因为 close() 方法为空实现,如下图:
关于更多 close() 方法参考 ByteArrayInputStream 类的 close() 方法。