❤️ 个人主页: 水滴技术
🚀 支持水滴: 点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏: Java 教程:从入门到精通
大家好,我是水滴~~
今天的主题是字节数组流,即ByteArrayInputStream
和 ByteArrayOutputStream
。这两个流主要用于字节数组与流之前的转换。
本文将通过“内部字段、构造函数、常用方法、代码案例”的方式来介绍这两个类,赶紧开始吧。
ByteArrayInputStream(字节数组输入流)
ByteArrayInputStream
会在内存中创建一个字节数组缓冲区,从流中读取的字节会保存在该缓冲区中,内部计数器跟踪读取方法提供的下一个字节。
内部字段
byte[] buf
由流的创建者提供的字节数组。
int pos
要从输入流缓冲区中读取的下一个字节的索引。
int count
流中缓冲区的有效字节数。
int mark
流中当前标记的位置。
构造函数
创建该字节数组输入流有两种方式。
ByteArrayInputStream(byte buf[])
通过字节数组buf
创建一个ByteArrayInputStream
实例,该字节数组不会被复制,而是直接作为它的缓冲区数组。pos
的初始值为0,count
的初始值为buf
的长度。
ByteArrayInputStream(byte buf[], int offset, int length)
通过字节数组buf
创建一个ByteArrayInputStream
实例,使用buf
作为缓冲区数组。pos
的初始值为offset
,count
的初始值为 “offset
+length
”和 “buf.length
” 的最小值。而mark
初始值为offset
。
常用方法
该类的常用方法与前面介绍的 InputStream
和 FileInputStream
的方法一样,可以参考《字节输入输出流:InputStream & OutputStream》和《文件字节输入输出流:FileInputStream & FileOutputStream》,这里就不再赘述。
代码案例
该代码案例重点介绍如何将字节数组转为流的,流的读取等操作与InputStream
和 FileInputStream
相同,不是本文的重点。
案例一:通过字节数组创建实例
代码示例:
public static void read1() throws IOException {
// 创建一个字节数组。
byte[] bytes = {97, 98, 99, 100, 101};
// 将字节数组转为流 ByteArrayInputStream
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
// 循环判断可读取字节数
while (bais.available() > 0) {
// 读取一个字节
System.out.println((char) bais.read());
}
// 关闭流并释放资源
bais.close();
}
输出内容:
a
b
c
d
e
案例二:通过字节数组和偏移量创建实例
代码示例:
public static void read2() throws IOException {
// 创建一个字节数组。
byte[] bytes = {97, 98, 99, 100, 101};
// 将字节数组转为流 ByteArrayInputStream
ByteArrayInputStream bais = new ByteArrayInputStream(bytes, 0, 3);
// 循环判断可读取字节数
while (bais.available() > 0) {
// 读取一个字节
System.out.println((char) bais.read());
}
// 关闭流并释放资源
bais.close();
}
输出内容:
a
b
c
ByteArrayOutputStream(字节数组输出流)
ByteArrayOutputStream
类会在内部创建一个字节数组缓冲区,所有写入输出流的数据会被保存到该缓冲区中。当数据写入缓冲区时,缓冲区的长度会自动增长,可以使用 toByteArray()
和 toString()
来检索缓冲区中的数据。
内部字段
byte[] buf
存储数据的内部缓冲区数组。
int count
缓冲区中的有效字节数。
构造函数
创建该字节数组输出流有两种方式。
ByteArrayOutputStream()
创建一个
ByteArrayOutputStream
实例,并创建一个内部缓冲区,大小使用默认值32。
ByteArrayOutputStream(int size)
创建一个ByteArrayOutputStream
实例,并创建一个内部缓冲区,大小使用指定的size
。
常用方法
该类的常用方法与前面介绍的 OutputStream
和 FileOutputStream
的方法基本相同,可以参考《字节输入输出流:InputStream & OutputStream》和《文件字节输入输出流:FileInputStream & FileOutputStream》。
这里主要列举一些不同的方法,主要有:
void writeTo(OutputStream out)
该当前输出流中的缓冲数据全部写入到另一个指定的输出流中。
byte[] toByteArray()
创建一个新的字节数组。它的大小与缓冲区大小相同,并且缓冲区的有效内容也复制到其中。
String toString()
将缓冲区中的字节转换为字符串,使用默认的字符集。
String toString(String charsetName)
将缓冲区中的字节转换为字符串,使用指定的字符集。
代码案例
该代码案例重点介绍如何将流转为字节数组的,流的写入等操作与OutputStream
和 FileOutputStream
相同,不是本文的重点。
案例一:创建一个字节数组输出流,缓冲区大小默认32
代码示例:
public static void write1() throws IOException {
// 创建一个字节数组。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 写入一个字节
baos.write(97);
// 写入一个字节
baos.write(98);
// 写入一个字节
baos.write(99);
// 写入一个字节
baos.write(100);
// 写入一个字节
baos.write(101);
// 获取输出流中的字节,并打印至控制台
byte[] bytes = baos.toByteArray();
System.out.println(new String(bytes));
// 关闭流并释放资源
baos.close();
}
输出内容:
abcde
案例二:创建一个字节数组输出流,缓冲区大小指定
代码示例:
public static void write2() throws IOException {
// 创建一个字节数组。
ByteArrayOutputStream baos = new ByteArrayOutputStream(3);
// 写入一个字节
baos.write(97);
// 写入一个字节
baos.write(98);
// 写入一个字节
baos.write(99);
// 写入一个字节
baos.write(100);
// 写入一个字节
baos.write(101);
// 将缓冲区中的字节转为字符串,并打印至控制台
System.out.println(baos.toString());
// 关闭流并释放资源
baos.close();
}
输出内容:
abcde
系列文章
🔥 【Java I/O 流】文件的操作——java.io.File 类详解
🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream
🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)
🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer
🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
🔥 【Java I/O 流】字节缓冲流:BufferedInputStream 和 BufferedOutputStream
🔥 【Java I/O 流】字符缓冲流:BuffreadReader 和 BufferedWriter
热门专栏
👍 《Java 教程:从入门到精通》
👍 《MySQL 教程:从入门到精通》