OutputStream是Java字节输出流抽象基类,需通过FileOutputStream等子类实例化;核心流程为获取流→write()写入字节→close()关闭;write()有三种重载,不处理编码,字符串需getBytes()转换;推荐try-with-resources自动管理资源,BufferedOutputStream等需flush()确保数据写出。

Java中OutputStream是所有字节输出流的抽象基类,它本身不能直接实例化,必须通过其子类(如FileOutputStream、ByteArrayOutputStream、BufferedOutputStream等)来完成实际的数据写入操作。核心流程就是:获取输出流 → 写入字节数据 → 关闭流。
创建合适的OutputStream子类实例
根据目标设备或用途选择对应子类:
-
写入文件:用
FileOutputStream,传入File对象或文件路径字符串 -
写入内存字节数组:用
ByteArrayOutputStream,适合临时拼接、转换场景 -
提升写入效率:套一层
BufferedOutputStream,减少底层I/O调用次数 -
网络输出:如
Socket.getOutputStream()返回的就是OutputStream子类实例
调用write()方法写入字节数据
有三种常用重载方式:
-
write(int b):写入单个字节(低8位),参数是int但只取最低一个字节 -
write(byte[] b):写入整个字节数组 -
write(byte[] b, int off, int len):从数组b的off索引开始,写入len个字节
注意:write()不自动换行、不处理字符编码,它只认字节。若要写字符串,需先用String.getBytes(Charset)转为字节数组。
立即学习“Java免费学习笔记(深入)”;
及时关闭流并处理异常
流使用完毕必须调用close(),否则可能造成资源泄漏或数据未真正写出(尤其带缓冲的流)。推荐用try-with-resources语法自动管理:
try (FileOutputStream fos = new FileOutputStream("data.bin")) {
fos.write("Hello".getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}
即使发生异常,流也会被自动关闭。如果手动关闭,记得在finally块中调用close(),并再次捕获IOException。
刷新缓冲区(必要时)
某些子类(如BufferedOutputStream)内部有缓冲区,write()只是把数据写进缓冲区,并不立即落盘。需要强制写出时调用flush():
- 一般在写完关键数据后、关闭前调用一次即可
-
close()内部通常会自动flush(),但显式调用更稳妥 - 网络流等场景中,
flush()可确保对端及时收到数据










