java nio管道专用于单jvm内两线程间单向通信,由sinkchannel(写)和sourcechannel(读)组成;需先获取对应通道、注意缓冲区状态与阻塞配置,并正确关闭通道以避免泄漏。

Java 中的 NIO 管道(Pipe)专用于**单个 JVM 进程内两个线程之间的单向数据传输**,不涉及网络或跨进程通信。它由一对通道组成:一个 SinkChannel(写入端)和一个 SourceChannel(读取端),数据只能从 sink 流向 source。
创建并初始化 Pipe
调用 Pipe.open() 获取管道实例,随后分别获取 sink 和 source 通道:
- 必须先获取
sink才能写入,先获取source才能读取 - 两个通道默认为阻塞模式;如需非阻塞,需显式调用
configureBlocking(false) - 管道容量无固定上限,但底层依赖系统管道缓冲区,写入时若缓冲区满会阻塞(阻塞模式下)或返回 0(非阻塞模式下)
向 Pipe 写入数据
通过 Pipe.SinkChannel 的 write() 方法写入 ByteBuffer:
- 务必确保 buffer 处于“写入就绪”状态:调用
flip()前要clear()或compact(),写入前调用flip()切换至读模式 - 由于
write()可能未一次性写完全部字节,需循环检查hasRemaining() - 示例关键步骤:
sinkChannel.write(buf)→ 若返回值小于 buf 中剩余字节数,继续循环
从 Pipe 读取数据
通过 Pipe.SourceChannel 的 read() 方法将数据读入 ByteBuffer:
- 读取前 buffer 应已清空(
clear()),保证有足够空间 -
read()返回实际读取字节数,-1 表示 EOF(Pipe 关闭且 sink 已关闭) - 读取后调用
flip()才能从 buffer 中提取数据;处理完再clear()准备下次读 - 若 source 通道处于非阻塞模式且无数据可读,
read()返回 0
线程协作与资源释放
Pipe 本质是线程间通信机制,典型用法是一个线程写、另一个线程读:
- 写线程完成写入后,应主动关闭
sinkChannel,通知读线程数据已结束 - 读线程检测到
read()返回 -1,即应停止读取并关闭sourceChannel - 整个
Pipe实例无需显式关闭,但两个通道都应 close,避免资源泄漏 - 注意:Pipe 不支持多写或多读,仅限一对一单向传输
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











