PrintWriter 的 checkError() 方法仅返回内部单向错误标志,不主动检测实时错误;该标志在捕获 IOException 时置为 true 后永不自动重置,适用于 flush 或 close 后检查历史错误,不可用于判断当前写操作是否成功。

PrintWriter 的 checkError 方法不会主动检测错误,它只返回内部维护的错误标志状态。这个标志一旦被置为 true,就再也不会自动变回 false —— 它是“单向开关”,不是实时探测器。
错误标志何时会被设置
PrintWriter 在内部捕获底层输出流(如 OutputStream 或 Writer)抛出的 IOException 时,会把 error flag 设为 true。常见触发场景包括:
- 磁盘满导致文件写入失败
- 网络连接中断后尝试向 SocketOutputStream 写数据
- 目标文件被其他进程独占锁定,无法写入
- 调用 flush() 或 close() 时底层流报错(注意:部分写操作如 print() 可能不立即触发异常,但 flush/close 一定会)
checkError 的正确用法
它适合在关键节点主动轮询,而不是依赖它来“发现”刚发生的错误。典型做法是:
- 每次重要写入后调用 flush(),再立即 checkError()
- 在循环写入中,每 N 条记录检查一次,避免频繁调用影响性能
- 关闭前必须 checkError(),因为 close() 可能触发最后一次 flush 并暴露错误
示例:
立即学习“Java免费学习笔记(深入)”;
pw.print("data");pw.flush();
if (pw.checkError()) {
System.err.println("写入已出错,后续操作可能无效");
}
为什么不能只靠 checkError 判断“当前写是否失败”
PrintWriter 默认启用自动刷新(auto-flush)仅对 println、printf、format 生效;普通 print() 和 write() 不触发 flush,错误可能延迟暴露。即使 auto-flush 开启,IOException 仍可能发生在 flush 过程中,而 checkError 返回的是上次 flush/call 的结果,不是本次 write 的即时反馈。
因此,若需强可靠性,建议:
- 显式调用 flush() 后立刻 checkError()
- 或直接使用底层 OutputStream/Writer,捕获并处理 IOException
- 避免在高可靠场景(如日志落盘、事务性输出)中仅依赖 PrintWriter
一个容易忽略的细节:error flag 不会重置
一旦 checkError() 返回 true,它将永远返回 true,即使后续写入成功。PrintWriter 没有 resetError() 方法。这意味着:
- 不能用它做“错误恢复后继续写”的判断依据
- 如果需要重试或降级,应自行管理错误状态,或重建 PrintWriter 实例
- checkError 主要用于“是否曾出错”,而非“当前是否可用”


















