应优先选用printwriter写文件并指定utf-8编码,因其是字符流、编码语义清晰且支持checkerror();控制台输出直接用system.out/err即可,无需关闭或指定编码;printstream适合简单脚本,但对中文等非ascii字符更敏感。

直接用 PrintStream 或 PrintWriter 向文件或控制台输出格式化文本,核心是选对构造方式、注意编码与刷新机制——它们不抛异常、支持 print/println/printf,但底层逻辑不同。
向控制台打印(最简单)
控制台输出无需额外构造,直接用现成的系统流即可:
-
System.out是PrintStream实例,天然支持printf("%d, %s", 42, "hello") -
System.err同样是PrintStream,适合输出错误信息,颜色/重定向行为由终端决定 - 不需要手动
close(),也不用管编码——它已绑定 JVM 启动时的标准输出通道
向文件写入中文不乱码的关键写法
文件写入必须显式指定字符集,否则默认用平台编码(如 Windows 的 GBK),中文极易出错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
PrintStream 写文件:
new PrintStream(new FileOutputStream("log.txt"), true, StandardCharsets.UTF_8)
第二个参数true开启自动刷新(仅对println/printf生效),第三个参数强制 UTF-8 -
PrintWriter 写文件:
new PrintWriter(Files.newBufferedWriter(Paths.get("log.txt"), StandardCharsets.UTF_8), true)
推荐这种写法:基于Files.newBufferedWriter,天然带缓冲、支持 charset、配合 try-with-resources 自动关闭 - 避免使用过时构造器:
new PrintStream("file.txt")已弃用,且只用于内部特殊场景,不是文件写入接口
print 和 println 的刷新差异必须清楚
自动刷新不是“每次调用都刷”,而是有触发条件的:
-
println()和printf(...)末尾含换行,会触发自动刷新(前提是构造时开启了 auto-flush) -
print()不换行,也不会刷新——写完看不到内容?大概率是只用了print没跟println或没手动flush() - 如果需要立即落盘(比如日志关键行),要么用
println,要么调用flush();close()也会 flush,但别依赖它来保证实时性
PrintStream vs PrintWriter 怎么选
区别不在“好不好用”,而在“处理什么数据”和“要不要查错”:
- 要写纯文本(尤其是含中文、emoji、多语言),优先选
PrintWriter——它是字符流,编码语义清晰,可调用checkError()主动判断是否写失败 - 若已习惯
System.out风格,且不关心 I/O 错误(比如简单脚本日志),PrintStream完全够用,但要注意字节流对非 ASCII 字符更敏感 - 生产环境建议用
Files.newBufferedWriter+PrintWriter组合,或直接上 Logback 等日志框架,更健壮可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










