pipedreader 和 pipedwriter 是 java 中用于线程间字符流通信的管道流,必须通过 connect() 绑定、在不同线程中读写,共享默认 1024 字符的循环缓冲区,需正确关闭以避免死锁或资源泄漏。

PipedReader 和 PipedWriter 是 Java IO 中专为线程间字符流通信设计的一对管道流,它们必须成对使用、相互绑定,一个线程写入 PipedWriter,另一个线程从关联的 PipedReader 读取,从而实现同步的字符数据传递。
必须先建立连接才能使用
两者不能独立工作,必须通过 connect() 方法绑定,或在构造时直接传入对方实例。未连接就调用 read/write 会抛出 IOException(提示 “Pipe not connected”)。
- 推荐方式:构造
PipedReader后,用其connect(writer)方法连接已创建的PipedWriter - 也可反向操作:用
PipedWriter(Reader)构造器直接绑定(Java 7+ 已弃用该构造器,建议统一用connect()) - 连接只需一次,且不可重复连接(再次调用会抛
IOException:“Already connected”)
读写需在不同线程中进行
这两个类内部使用了共享的循环缓冲区(默认大小 1024 字符),并自带同步和等待/通知机制。如果在同一个线程里先写后读,会因缓冲区满或空导致死锁(比如 write 阻塞等待 reader 消费,而 reader 还没启动)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 典型模式:一个线程负责
write(),另一个线程循环调用read()或read(char[]) - 写入方写完应调用
close(),这会触发读取方的read()返回 -1(表示流结束) - 若读取方提前关闭
PipedReader,写入方再写会抛IOException(“Write end dead”)
注意异常与资源释放
管道流不涉及底层文件或网络,但依然要正确处理异常和关闭,否则可能造成线程挂起或资源泄漏。
- 捕获
IOException—— 它可能来自连接中断、对方关闭、缓冲区状态异常等 - 务必在 finally 块或 try-with-resources 中关闭 至少一端(关闭任一端都会中断管道,另一端下次 I/O 会立即失败)
- 不要在读写过程中忽略
InterruptedIOException(当线程被中断时抛出),应合理响应中断
简单示例:生产者-消费者模型
以下是一个最小可运行片段,展示两个线程通过管道传递字符串:
PipedReader reader = new PipedReader();
PipedWriter writer = new PipedWriter();
reader.connect(writer); // 必须连接
Thread writerThread = new Thread(() -> {
try {
writer.write("Hello, Pipe!");
writer.close(); // 触发 reader 端 read() 返回 -1
} catch (IOException e) {
e.printStackTrace();
}
});
Thread readerThread = new Thread(() -> {
try {
char[] buf = new char[16];
int len;
while ((len = reader.read(buf)) != -1) {
System.out.print(new String(buf, 0, len));
}
} catch (IOException e) {
// 对方关闭或异常时自然退出
} finally {
try { reader.close(); } catch (IOException ignored) {}
}
});
writerThread.start();
readerThread.start();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










