PrintStream 默认吞掉异常,需调用 checkError() 检测错误状态;启用自动刷新可加快错误暴露;建议关键写入后立即检查,关闭前务必调用 checkError() 并正确释放资源。

PrintStream 默认吞掉异常,必须主动检查错误状态才能捕获写入失败。它设计初衷是简化控制台/文件输出(比如 System.out.println()),所以底层发生 IOException 时不会向上抛出,而是默默设置内部错误标志。
检查 checkError() 方法
这是最直接的方式:每次关键写入后调用 checkError(),它会返回 true 表示之前某次操作已出错(如磁盘满、文件关闭、权限不足等)。
- 它不重置错误状态,一旦出错就一直返回
true,直到你手动调用flush()或close() - 建议在重要写入后立即检查,例如:
ps.print("data");<br>if (ps.checkError()) {<br> System.err.println("PrintStream 写入失败");<br>}
启用自动刷新并配合 flush 使用
构造 PrintStream 时传入 true 启用自动刷新,能更快暴露问题(尤其对带缓冲的输出流):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
new PrintStream(new FileOutputStream("log.txt"), true)—— 每次println()后自动flush() -
flush()会触发底层写入,若此时失败,checkError()就会变为true - 注意:
print()不刷新,println()和printf()在自动刷新模式下才刷
改用更严格的替代方案
如果需要明确异常传播,推荐用 PrintWriter(可配置是否抛异常)或直接用 OutputStream:
立即学习“Java免费学习笔记(深入)”;
-
PrintWriter pw = new PrintWriter(new FileWriter("out.txt"), true);—— 自动刷新,但checkError()仍是主要错误检测方式 - 真正想抛异常?绕过 PrintStream,用
OutputStream.write()+try-catch(IOException),例如:try (FileOutputStream fos = new FileOutputStream("data.bin")) {<br> fos.write(bytes); // 这里会真实抛 IOException<br>}
注意 close() 的时机和作用
close() 会强制刷新并释放资源,此时若底层写入失败,checkError() 通常已经为 true;但 close() 本身不抛异常(这也是 PrintStream 的妥协设计)。
- 务必在 finally 或 try-with-resources 中关闭,避免资源泄漏
- 关闭前调用一次
checkError(),确保没遗漏写入错误

















