printwriter 更适合写入格式化文本,因其支持指定编码(如 utf-8)、异常更可控;printstream 为字节流、默认平台编码、异常被静默吞掉,需手动 checkerror()。

Java 中用 PrintStream 和 PrintWriter 向文件写入格式化文本,核心是:先关联文件(通过 FileOutputStream 或 FileWriter),再调用 printf、format 或带格式的 print 方法。两者都支持 C 风格格式化语法(如 %s、%d、%.2f),但设计定位和异常处理方式不同。
PrintStream 写文件:适合二进制/字节流场景
PrintStream 是字节流,底层基于 OutputStream,默认使用平台默认编码,不抛出 IOException(异常被静默吞掉,仅设置错误标志),因此需手动检查 checkError()。
- 创建时传入
FileOutputStream,例如:PrintStream ps = new PrintStream(new FileOutputStream("output.txt")); - 用
printf或format写格式化内容:ps.printf("姓名:%s,年龄:%d,薪资:%.2f%n", "张三", 28, 8500.5)
(%n是平台无关换行符) - 务必调用
ps.close()或使用 try-with-resources 自动关闭;
若需确认写入是否失败,之后调用if (ps.checkError()) { /* 处理错误 */ }
PrintWriter 写文件:推荐用于纯文本,更安全可控
PrintWriter 是字符流,基于 Writer,可指定编码(如 UTF-8),构造时可选是否自动刷新(autoFlush = true),且 printf 等方法不会抛异常(但底层 Writer 的 write 操作仍可能出错)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 推荐显式指定编码,避免乱码:
PrintWriter pw = new PrintWriter(Files.newBufferedWriter(Paths.get("output.txt"), StandardCharsets.UTF_8));
或传统方式:PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")); - 格式化写入方式与
PrintStream完全一致:pw.printf("ID:%d,名称:%s,时间:%tF%n", 101, "测试项", new Date()); - 若启用自动刷新(如
new PrintWriter(..., true)),每次println、printf后会立即刷入磁盘;否则需手动调用pw.flush()保证内容落盘。
关键区别与选用建议
-
编码控制:PrintWriter 更容易指定编码(尤其配合
Files.newBufferedWriter),PrintStream 依赖系统默认,易出乱码。 -
异常反馈:PrintStream 吞异常,靠
checkError()主动查;PrintWriter 构造时可能抛IOException(如文件不可写),运行时格式化方法不抛,但底层写操作失败后后续调用checkError()也可能返回 true。 - 适用场景:日常文本日志、配置生成等优先用 PrintWriter;若已处于字节流上下文(如封装在网络输出中),或需兼容旧代码,可用 PrintStream。
完整示例(PrintWriter + UTF-8)
以下代码安全写入带中文的格式化数据:
try (PrintWriter pw = new PrintWriter(
Files.newBufferedWriter(Paths.get("report.txt"), StandardCharsets.UTF_8))) {
pw.printf("生成时间:%tY-%<tm- new date pw.printf catch e system.err.println e.getmessage></tm->注意:使用 try-with-resources 确保自动关闭,避免资源泄漏;%<tr> 表示复用前一个时间参数,简化写法。</tr>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










