bytearrayinputstream 是内存中只读字节数组流,配合 bytearrayoutputstream 实现内存读写闭环,适用于二进制数据处理;注意内存占用及随机访问需用 bytebuffer。

ByteArrayInputStream 是 Java 中用于在内存中读取字节数组的输入流,它不涉及磁盘或网络 I/O,所有操作都在内存中完成,速度快、开销小。它本身只支持读取,不能写入;若需在内存中既读又写,应配合 ByteArrayOutputStream 使用,二者常成对出现。
ByteArrayInputStream:从字节数组“读”数据
它把一个已有的 byte[] 封装成 InputStream,后续可用标准流方式(如 read()、read(byte[]))逐字节或批量读取:
- 构造时传入字节数组,可指定起始位置和长度(默认读整个数组)
- 内部维护一个游标(
pos),每次读取后自动前移;读到末尾返回-1 - 不修改原数组,只是“读视图”,线程不安全,多线程需同步
示例:
byte[] data = "Hello".getBytes(StandardCharsets.UTF_8);ByteArrayInputStream bis = new ByteArrayInputStream(data);
int b;
while ((b = bis.read()) != -1) {
System.out.print((char) b); // 输出 Hello
}
ByteArrayOutputStream:在内存中“写”数据
它是字节数组版的输出流,所有写入内容自动累积到内部动态扩容的 byte[] 中:
- 构造时可指定初始容量,避免频繁扩容
- 调用
write()或write(byte[])追加数据 - 最终通过
toByteArray()获取完整字节数组,或用toString()转字符串
示例:
ByteArrayOutputStream bos = new ByteArrayOutputStream();bos.write("Hi ".getBytes());
bos.write("World".getBytes());
byte[] result = bos.toByteArray(); // 得到 "Hi World" 的字节数组
组合使用:内存中“读→处理→写”闭环
典型场景是解析/转换二进制数据(如图片处理、协议编解码、JSON/XML 内存流转):
- 先用
ByteArrayInputStream读原始字节 - 用某工具类(如
ObjectInputStream、ImageIO、自定义解析器)处理 - 结果写入
ByteArrayOutputStream,再转回字节数组供后续使用
示例(简单拷贝+转大写):
byte[] src = "abc".getBytes();ByteArrayInputStream bis = new ByteArrayInputStream(src);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b;
while ((b = bis.read()) != -1) {
bos.write(Character.toUpperCase((char) b));
}
byte[] upper = bos.toByteArray(); // 得到 "ABC"
注意点与替代方案
- 两者都基于堆内存,大数据量时注意
OutOfMemoryError - JDK 9+ 推荐优先使用
Arrays.copyOf()、ByteBuffer或 NIO 的BytesStream(如Files.readAllBytes()返回不可变数组)处理简单场景 - 若需随机读写(如跳过、重读、修改某位置),
ByteArrayInputStream不支持,改用ByteBuffer.wrap(byte[])更灵活
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











