OutputStream 的 write(byte[] b) 方法可一次性写入整个字节数组,常用且无需循环;其重载方法 write(byte[] b, int off, int len) 支持指定范围写入;需注意缓冲机制,close() 会自动 flush(),推荐使用 try-with-resources。

Java 中 OutputStream 本身是抽象类,不能直接实例化,但它的子类(如 FileOutputStream、ByteArrayOutputStream、System.out 等)都提供了 write(byte[] b) 方法,用于一次性写入整个字节数组。
使用 write(byte[] b) 写入完整数组
这是最常用的方式,将整个字节数组内容写入输出流:
- 调用
outputStream.write(byteArray)即可,无需循环 - 该方法会尝试写入数组全部字节(长度为
byteArray.length) - 注意:不保证一次全部写完(尤其在网络流中),但本地文件或内存流通常能完成
示例:
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello" 的 ASCII 字节数组
try (FileOutputStream fos = new FileOutputStream("hello.bin")) {
fos.write(data); // 一次性写入全部 5 个字节
}
指定范围写入:write(byte[] b, int off, int len)
当只需写入数组中某一段时,用三参数重载方法:
-
off:起始偏移(索引),从 0 开始 -
len:要写入的字节数 - 确保
off ≥ 0、len ≥ 0,且off + len ≤ b.length,否则抛IndexOutOfBoundsException
示例(跳过第一个字节,写入后 4 个):
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F};
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
baos.write(data, 1, 4); // 写入 [65,6C,6C,6F] → "ello"
System.out.println(Arrays.toString(baos.toByteArray())); // [101, 108, 108, 111]
}
注意 flush() 和 close() 的时机
写入操作可能被缓冲,尤其是 BufferedOutputStream 或文件流:
-
write()只负责把数据送入缓冲区,不一定立刻落盘或发送 - 调用
flush()强制刷新缓冲区(适用于需实时生效的场景) -
close()会自动调用flush(),所以用 try-with-resources 是安全且推荐的
常见子类适用场景
- FileOutputStream:写入文件(二进制文件如图片、音频、序列化对象)
-
ByteArrayOutputStream:写入内存字节数组,最后用
toByteArray()获取结果(适合中间处理) -
System.out:本质是
PrintStream,也继承自OutputStream,支持write(byte[]),但一般用于原始字节调试 - Socket.getOutputStream():向网络对端发送二进制数据
只要拿到的是具体子类实例,传入合法的非 null 字节数组,调用 write(byte[]) 就能完成二进制输出。关键是选对流类型,并在必要时正确关闭或刷新。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











