Pipe实现单向管道传送的通道对等端.管道是由两端组成:一个可写入的sink通道和一个可读取的source通道(根据数据来源).一旦将某些字节写入接受器通道,就可以按照与写入时完全相同的顺序从源通道中读取这些字节.在另一个线程从管道中读取这些字节或先前已写入的字节之前,是否阻塞将该字节写入管道的线程是与系统相关的,因此是未指定的.
Pipe名为管道,其实底层实现为一个本地的TCP链接:即一个侦听本地port的ServerSocketChannel,以及一个链接到此port上SocketChannel,最终建立连接后获得2个SocketChannel引用;其中Server端的SocketChannel作为Pipe.sink,Client端的SocketChannel作为Pipe.source.因为Sink和Source都封装了高层的SocketChannel,所以它们也支持阻塞模式的设定,最终影响到SocketChannel.
Sink为数据的输出端,此类实现了SeleactableChannel/WritableChannel/GatheringByteChannel,由此可见Sink本身支持中断操作/Selector/write操作;Sink负责向Pipe中写入数据.
Source为数据消费端(读取端),此类实现了SelectableChannel/ReadableChannel/ScatteringByteChannel,它具有Sink的其他特性,但是Source只能read.
Pipe是IO操作中一个有趣的单工模式.大部分情况下,我们无需使用Selector,因为在Pipe中使用selector实在是难以理解:1)无事件切换 2) 必然阻塞性(根据数据流动性).
PipeImpl源码:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/nio/ch/PipeImpl.java.html
- public static Pipe open() throws IOException:打开一个通道.通过调用系统级默认的SelectorProvider.openPipe()方法来创建管道.
- public abstract Pipe.SinkChannel sink():获取通道的输入端.SinkChannel底层封装了作为客户端的SocketChannel,SinkChannel.validOps()只能为OP_WRITE
- public abstract Pipe.SourceChannel source():获得通道的输出端.SourceChannel底层封装了ServerSocketChannel.accept()得到的SocketChannel,其validOps()只能为OP_READ.
Pile实例参考:http://shift-alt-ctrl.iteye.com/blog/1840414