printstream是字节打印流,继承自outputstream,底层包装outputstream,print系列方法自动将字符转为字节输出;printwriter是字符打印流,包装writer,支持显式指定字符集,更安全处理中文。

PrintStream 本身是字节流,不能直接用于字符流场景,但能以字节方式“打印”字符数据(自动编码)。 它底层包装的是 OutputStream(如 FileOutputStream 或 System.out),所有 print/println 方法都会将传入的 char、String 等先按平台默认编码(或指定编码)转为字节,再写入底层字节流。
PrintStream 的本质是带格式化能力的字节输出流
它继承自 FilterOutputStream,属于 java.io.OutputStream 体系,不是 Reader/Writer(字符流)。这意味着:
- 构造时必须传入 OutputStream(例如 new PrintStream(new FileOutputStream("a.txt")))
- 调用 print("你好") 时,JVM 会把字符串按默认编码(如 UTF-8 或 GBK)编码成字节数组,再写入
- 不支持直接传入 Charset 显式指定编码(Java 1.5+ 的 PrintStream 构造器中虽有 charset 参数,但仅用于内部转换,不改变其字节流本质)
如何安全地用 PrintStream 输出中文等字符
避免乱码的关键是确保编码一致。推荐做法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 显式指定字符集(Java 1.5+):
new PrintStream(new FileOutputStream("out.txt"), true, "UTF-8") - 若写到控制台(System.out),需确认终端编码与 JVM 默认编码匹配(如 Windows 命令行常用 GBK,Linux/macOS 多为 UTF-8)
- 不依赖系统默认编码,尤其在跨平台部署时——始终显式传入 "UTF-8"
字符流场景下,别硬套 PrintStream
如果已有一个 Writer(如 FileWriter、OutputStreamWriter),想实现类似 println 的功能,应优先使用 PrintWriter(它是真正的字符流封装):
-
new PrintWriter(new FileWriter("a.txt", StandardCharsets.UTF_8))(Java 11+) new PrintWriter(new OutputStreamWriter(new FileOutputStream("a.txt"), "UTF-8"))- PrintWriter 支持 print/println,且所有操作都在字符层面,不涉及隐式编码转换
常见误用与提醒
以下写法容易出问题:
-
new PrintStream(new FileWriter("a.txt"))—— 编译不通过:FileWriter 是 Writer,不能传给 PrintStream 构造器 - 只用
new PrintStream("a.txt")(String 路径构造器)—— 使用默认编码,跨环境易乱码 - 认为 PrintStream “支持 Unicode” 就不用管编码——实际它只是忠实执行编码动作,编码错了,输出照样是乱码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










