BufferedOutputStream是字节缓冲输出流,只能包装OutputStream(如FileOutputStream),用于二进制数据高效写入;处理文本应使用BufferedWriter配合OutputStreamWriter指定编码,避免乱码。

BufferedOutputStream 是字节流的缓冲包装器,不能直接用于字符流;若想为字符流提速,应使用 BufferedWriter 而非 BufferedOutputStream。
BufferedOutputStream 专用于字节流
它只能包装 OutputStream(如 FileOutputStream、ByteArrayOutputStream),对写入的字节数据进行缓冲,减少底层 I/O 调用次数。它不处理字符编码,也不认识 char、String 等字符类型。
- 正确用法:new BufferedOutputStream(new FileOutputStream("a.bin"))
- 错误用法:试图用它包装 FileWriter 或直接写字符串(会触发 getBytes() 默认编码,易出乱码且不可控)
写文本文件该用 BufferedWriter
处理文本时,应选择字符流体系:FileWriter → BufferedWriter。后者内部缓冲字符,并在 write(String) 时按指定编码(默认平台编码,建议显式指定 OutputStreamWriter + BufferedWriter 组合)转为字节。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 推荐写法:new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"), "UTF-8"))
- 简写(不推荐,编码不可控):new BufferedWriter(new FileWriter("a.txt"))
为什么不能混用 BufferedOutputStream 和字符串写入?
BufferedOutputStream 的 write(String) 方法已被废弃(Java 19+ 移除),其 write(byte[]) 本质是调用 String.getBytes(),而该方法使用平台默认编码,跨环境极易导致中文乱码;且无法指定编码,违背字符流设计初衷。
立即学习“Java免费学习笔记(深入)”;
- 隐患示例:bos.write("你好".getBytes()) —— 编码不确定,测试通过不代表生产安全
- 替代方案:用 OutputStreamWriter 显式编码,再套 BufferedWriter 提升性能
性能对比与选择建议
小量文本写入时差异不明显;大量写入时,BufferedOutputStream + 手动编码不如 BufferedWriter + 指定编码稳定高效。核心原则:字节流管“二进制”,字符流管“文本”,别越界。
- 写图片、音频、序列化对象 → BufferedOutputStream + FileOutputStream
- 写日志、配置、HTML、JSON 文本 → BufferedWriter + OutputStreamWriter(指定 UTF-8)
- 读取同理:BufferedInputStream 对应字节,BufferedReader 对应字符

















