ByteArrayOutputStream 是 Java IO 中的字节数组输出流,核心作用是将数据写入到内存中的字节数组(内部维护可变字节缓冲区),最终可通过 toByteArray() 或 toString() 获取完整数据。它属于内存流(不涉及磁盘 IO),读写效率高,常用于临时存储字节数据、数据转换(如字符串→字节数组)、网络传输数据拼接等场景。
- 内存存储:数据写入内存缓冲区,无需磁盘文件,速度快。
- 动态扩容:内部字节数组会根据写入数据量自动扩容(默认初始容量 1024 字节,满后按
2*当前容量+2 扩容)。
- 线程安全:所有
write 方法加了 synchronized 锁,支持多线程并发写入(但效率较低,单线程场景无需关注)。
- 无关闭成本:关闭后仍可继续使用(
close() 方法为空实现),无需担心流关闭后无法写入。
示例:
// 默认容量(1024字节)
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
// 自定义初始容量(适合已知大致数据大小的场景)
ByteArrayOutputStream baos2 = new ByteArrayOutputStream(2048);
用于向内存缓冲区写入字节数据,有 3 种常用重载:
示例:
这是 ByteArrayOutputStream 最核心的用途 —— 获取写入的完整数据:
示例:
清空缓冲区中的数据,可重新写入(缓冲区容量不变,避免创建新对象,节省内存)。
示例:
ByteArrayOutputStream 的
close() 方法是空实现(源码中无任何操作),关闭后仍可正常写入和读取数据。
(注:Java IO 规范要求关闭流,但此处关闭无实际意义,仅为了符合
AutoCloseable 接口规范)
示例:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.close(); // 关闭流(无效果)
baos.write("关闭后仍可写入".getBytes()); // 正常执行
System.out.println(baos.toString()); // 输出:关闭后仍可写入