ByteArrayOutputStream是Java中基于内存的字节输出流,内部自动扩容字节数组,无需close();常用于序列化、拼接二进制数据及与ByteArrayInputStream配合实现内存流式处理。

在 Java 中,ByteArrayOutputStream 是一个内存中的字节输出流,它把写入的数据暂存在内部的字节数组里,不涉及磁盘或网络 I/O。适合用于临时收集输出(比如序列化对象、拼接二进制数据、生成动态内容等),之后再统一转成 byte[] 或字符串。
基本用法:写入 + 获取字节数组
创建实例后,像普通输出流一样调用 write() 方法,最后用 toByteArray() 拿到完整字节数据:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write('H');
baos.write('e');
baos.write('l');
baos.write('l');
baos.write('o');
byte[] bytes = baos.toByteArray(); // 得到 {72, 101, 108, 108, 111}
String s = baos.toString(StandardCharsets.UTF_8); // "Hello"
配合其他流使用(如 ObjectOutputStream)
常作为“中间载体”,把对象序列化结果先存进内存:
- 构造
ObjectOutputStream时传入ByteArrayOutputStream - 调用
writeObject()写入对象 - 调用
toByteArray()获取序列化后的原始字节
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(new Person("Alice", 30));
}
byte[] serialized = baos.toByteArray(); // 可保存、传输、加密等
注意缓冲区自动扩容和关闭问题
ByteArrayOutputStream 内部数组会自动扩容,无需手动管理容量;但它没有底层资源(如文件句柄),所以 不需要强制 close() —— 调用 close() 不会报错,但也没实际作用。JDK 文档明确说明:“此方法无效”。
不过,若你把它包装进 try-with-resources,编译器不会报错,运行也安全,只是纯属冗余。更推荐直接用完即弃。
与 ByteArrayInputStream 配合做内存管道
写完后可立刻用 ByteArrayInputStream 读取,实现“内存中流式处理”:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("data".getBytes(StandardCharsets.UTF_8));
// 转成输入流继续处理
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
// 接着用 DataInputStream、BufferedReader 等读取...
这种组合常见于测试、模板渲染、协议编码/解码等场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











