bytearrayoutputstream.writeto的作用是将内存中已写入的字节数据一次性复制到指定outputstream,不改变自身内容且不关闭目标流;内部遍历缓冲区逐块写入,需用户负责目标流的打开与关闭。

ByteArrayOutputStream.writeTo 方法的作用,就是把当前内存中已写入的字节数据,**一次性复制到指定的 OutputStream 中**,不改变原 ByteArrayOutputStream 的内容,也不关闭目标流。
核心用法:直接传入目标 OutputStream
调用 writeTo(OutputStream out) 时,只需把你要写入的目标流(比如 FileOutputStream、SocketOutputStream、ServletOutputStream 等)作为参数传进去即可:
- ByteArrayOutputStream 内部会遍历自己的缓冲区(
buf),调用out.write(...)把全部已写入的字节逐块写过去 - 不会清空自身缓冲区,后续仍可继续 write 或 toByteArray()
- 目标 OutputStream 需要由你负责打开和关闭(writeTo 不会自动 close)
典型场景示例
比如把生成的 JSON 或图片字节先暂存到内存,再输出到文件或网络:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 写入一些数据(例如序列化对象、拼接 HTML)
baos.write("Hello, World!".getBytes(StandardCharsets.UTF_8));
// 输出到文件
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
baos.writeTo(fos); // ✅ 关键一步:把内存数据倒进 fos
}
// fos 自动关闭,baos 仍可用
注意事项
- 目标 OutputStream 必须是可写的、未关闭的状态;如果已关闭,会抛
IOException - 如果目标流写入过程中失败(如磁盘满、网络中断),异常会原样抛出,ByteArrayOutputStream 不做重试或回滚
- 不建议对大文件(如几百 MB)长期用 ByteArrayOutputStream 缓存——容易 OOM;此时应考虑直接流式处理
替代方案对比
如果你只是想“获取字节数组再写出去”,也可以手动调用 baos.toByteArray() + out.write(...),但 writeTo 更高效:
- 避免额外创建新 byte[] 数组(toByteArray() 会复制一份)
- 内部按 chunk 写入(默认 8192 字节块),减少系统调用次数
- 语义更清晰:明确表达“导出到某流”的意图
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











