ByteArrayOutputStream 用于内存中缓存字节数据,需调用 toByteArray() 获取数组后导出为文件、字符串或 InputStream;支持 reset() 复用实例以减少 GC 压力。

ByteArrayOutputStream 是 Java 中用于在内存中临时收集字节数据的工具类,它不直接“导出”到文件或网络,而是把写入的数据缓存在内部 byte[] 数组里;真正导出需要后续将这个数组转为文件、字符串、输入流或其他目标格式。
获取字节数组并保存为文件
这是最常见需求:把内存中拼好的字节内容写入磁盘文件。
- 调用 toByteArray() 获取完整字节数组(注意:每次调用都新建数组,不共享)
- 用 Files.write() 或 FileOutputStream 写入文件
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("Hello".getBytes(StandardCharsets.UTF_8));
baos.write(" World".getBytes(StandardCharsets.UTF_8));
// 导出为文件
byte[] data = baos.toByteArray();
Files.write(Paths.get("output.txt"), data);
转换为字符串(适合文本内容)
如果写入的是文本数据,可直接转成字符串,避免手动处理编码问题。
- 推荐用 toString(Charset)(JDK 10+)或 toString(String charsetName)
- 避免用无参 toString() —— 它依赖平台默认编码,不可靠
String text = baos.toString(StandardCharsets.UTF_8); // 推荐
// String text = baos.toString("UTF-8"); // 兼容旧版本
作为输入流继续处理(如解析、上传、加密)
很多 API 接收 InputStream,这时可把 ByteArrayOutputStream 的结果包装成 ByteArrayInputStream。
- 用 new ByteArrayInputStream(baos.toByteArray()) 创建可重复读取的输入流
- 注意:ByteArrayInputStream 不支持 mark/reset,如需,可先用 BufferedInputStream 包一层
InputStream is = new ByteArrayInputStream(baos.toByteArray()); // 传给需要 InputStream 的方法,比如 JSON 解析器、HTTP 客户端等
重用 ByteArrayOutputStream(减少内存分配)
频繁创建/销毁 ByteArrayOutputStream 可能带来 GC 压力。可通过 reset() 清空内容复用实例。
- 调用 reset() 后,内部缓冲区索引归零,但底层数组仍保留(容量不缩容)
- 若确定后续数据远小于当前容量,可考虑新建实例避免浪费内存

















