java中bytearrayoutputstream是动态扩容的内存缓冲区,通过write()写入字节,tobytearray()获取结果;可配合dataoutputstream写结构化数据;需注意编码一致、避免大容量滥用及tobytearray()性能问题。

Java 中用 ByteArrayOutputStream 组装字节数据,核心是把它当作一个可动态扩容的内存缓冲区,通过多次 write() 写入字节或字节数组,最后调用 toByteArray() 或 toString() 获取结果。
直接写入原始字节或字节数组
这是最常用的方式:创建实例后,反复调用 write(int) 或 write(byte[]),内部自动扩容,无需关心底层数组大小。
示例:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(65); // 写入单个字节 'A'
baos.write(new byte[]{66, 67}); // 写入字节数组 "BC"
baos.write("DE".getBytes(StandardCharsets.UTF_8)); // 写入字符串转成的字节
byte[] result = baos.toByteArray(); // 得到 [65, 66, 67, 68, 69]
配合 DataOutputStream 写入结构化数据
如果要组装包含 int、long、double 等基本类型的数据(比如自定义协议头),可包装成 DataOutputStream,它会按规范写入二进制格式。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
示例:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(12345); // 写入 4 字节 big-endian int
dos.writeLong(0x1234567890ABCDEFL); // 写入 8 字节 long
dos.writeUTF("hello"); // 写入带长度前缀的 UTF-8 字符串
byte[] packet = baos.toByteArray(); // 合并后的完整字节流
避免常见陷阱
-
不要重复使用已关闭的流:虽然
ByteArrayOutputStream的close()是空实现,但调用后不应再写入,否则逻辑易混淆;建议不用显式 close -
注意编码一致性:字符串转字节时务必显式指定字符集(如
StandardCharsets.UTF_8),避免依赖平台默认编码 - 大容量场景慎用:它把所有数据存在内存中,若预计超过几 MB,考虑改用临时文件或流式处理
- toByteArray() 返回新数组:每次调用都复制一次,频繁调用且数据大时注意性能;如只需一次结果,调用一次即可
与 ByteArrayInputStream 配合做内存流处理
组装完数据后,常需立刻解析或传输。可直接用 ByteArrayInputStream 包装结果字节数组,形成“写完就读”的内存管道。
示例:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); // ... 写入数据 byte[] data = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(data); // 接着用 DataInputStream 解析,或传给其他需要 InputStream 的 API DataInputStream dis = new DataInputStream(bais); int value = dis.readInt();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










