pipedinputstream 和 pipedoutputstream 是 java 中用于同进程内线程间字节通信的管道流,需配对连接、单线程独占使用,基于内存缓冲区实现阻塞式读写,适用于简单生产者-消费者场景。

PipedInputStream 和 PipedOutputStream 是 Java 提供的一对用于线程间字节级通信的管道流,它们通过内存缓冲区连接,无需依赖外部资源(如文件或网络),适合在同进程内两个线程之间传递数据。
核心原理:管道必须配对使用
一个线程写入 PipedOutputStream,另一个线程从关联的 PipedInputStream 读取,二者通过 connect() 方法绑定。未连接或连接后单方面关闭会导致 IOException(如 “Pipe broken”)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意:不能用同一个管道流在多个线程中并发读/写;每个流只应被一个线程独占使用。
基本使用步骤
- 创建一对管道流:new PipedInputStream() 和 new PipedOutputStream()
- 调用
pipedReader.connect(pipedWriter)或pipedWriter.connect(pipedReader)建立连接(二者等价) - 启动两个线程:一个向 PipedOutputStream 写数据,另一个从 PipedInputStream 读数据
- 写线程写完后建议调用
close(),读线程检测到流关闭会自然退出(read()返回 -1)
简单示例:生产者-消费者模式
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out); // 或 out.connect(in)
Thread writer = new Thread(() -> {
try {
for (int i = 0; i {
try {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
System.out.print(new String(buf, 0, len));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try { in.close(); } catch (IOException ignored) {}
}
});
writer.start();
reader.start();
注意事项与常见问题
-
阻塞行为:读端无数据时
read()阻塞;写端缓冲区满(默认 1024 字节)时write()阻塞 —— 这是同步机制的基础,但需确保读写节奏匹配,否则可能死锁 -
异常处理:若写端提前关闭,读端再调用
read()会抛IOException("Read end dead");反之亦然 - 不支持多写或多读:一个 PipedInputStream 只能连接一个 PipedOutputStream;不适用于一对多或广播场景
-
替代方案考虑:若需更灵活的线程通信(如对象传递、解耦、缓冲控制),优先考虑
BlockingQueue(如ArrayBlockingQueue、SynchronousQueue)或Exchanger
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










