在 Java 中java.io.IOException: Broken pipe 是一个常见的网络通信异常通常发生在尝试向一个已经关闭的连接写入数据时。这种错误常见于客户端或服务器端主动关闭了连接但另一端仍在尝试写入数据的情况。1、异常含义“Broken Pipe”管道破裂表示在进程间通信如 Socket 通信中连接的一端已经关闭而另一端仍在尝试向该连接写入数据。这就像一条输水管道一端被堵住或关闭了而另一端还在不断地注水导致管道破裂。2、常见场景客户端主动关闭连接例如用户刷新页面、关闭浏览器、点击“停止加载”等行为会导致客户端关闭连接。网络超时或资源不足当服务器处理时间较长而客户端设置了较短的超时时间时可能会提前关闭连接。Nginx 或反向代理超时如果使用了 Nginx 等代理服务器其默认的 proxy_read_timeout 是 60 秒若服务端响应时间超过此值Nginx 会关闭连接导致服务器端出现 Broken pipe 异常。服务端处理时间过长在大文件或流式响应场景中若服务端处理时间超过客户端的超时时间也可能引发该异常。3、解决方案检查连接状态在向客户端写入数据前应先确认客户端是否仍然连接。使用异常处理机制捕获异常通过 try-catch 捕获 SocketException 或 IOException并根据具体错误信息如 Broken pipe进行处理。增加超时设置适当延长客户端和服务端的超时时间避免因响应时间过长而导致连接被提前关闭。优化响应负载减少 API 响应的数据量提高响应速度降低 Broken pipe 的发生概率。处理信号与资源管理确保在关闭连接后及时释放资源并注意对 SIGPIPE 信号的处理。升级软件版本对于某些特定环境如 Doris升级到支持修复的版本可以避免该问题。4、示例代码try {outputStream.write(data);} catch (IOException e) {if (Broken pipe.equals(e.getMessage()) || Connection reset by peer.equals(e.getMessage())) {// 记录日志并关闭资源log.warn(客户端已断开连接停止写入: {}, e.getMessage());} else {throw e;}}