Java Nio 十六

2018/01/22 Java

Java NIO 十六

管道

管道就是一个用来在两个实体之间单向传输数据的导管。Unix 系统中,管道被用来连接一个进程的输出和另一个进程的输入。Pipe 类实现一个管道范例,不过它所创建的管道是进程内(在 Java 虚拟机进程内部)而非进程间使用的。

类的结构图如下: 图一

Pipe 类创建一对提供环回机制的 Channel 对象。这两个通道的远端是连接起来的,以便任何写在 SinkChannel 对象上的数据都能出现在 SourceChannel 对象上。

package java.nio.channels; 
public abstract class Pipe {
    public static Pipe open( ) throws IOException 
    public abstract SourceChannel source( ); 
    public abstract SinkChannel sink( );

    
    public static abstract class SourceChannel
        extends AbstractSelectableChannel
        implements ReadableByteChannel, ScatteringByteChannel
    public static abstract class SinkChannel
        extends AbstractSelectableChannel
        implements WritableByteChannel, GatheringByteChannel

}

如图: 图二

Pipe 实例是通过调用不带参数的 Pipe.open( )工厂方法来创建的。Pipe 类定义了两个嵌套的通道类来实现管路。这两个类是 Pipe.SourceChannel(管道负责读的一端)和 Pipe.SinkChannel(管道负责写的一端)。这两个通道实例是在 Pipe 对象创建的同时被创建的,可以通过在 Pipe 对象上分别调用 source( )sink( )方法来取回。

管道可以被用来仅在同一个 Java 虚拟机内部传输数据。虽然有更加有效率的方式来在线程之间传输数据,但是使用管道的好处在于封装性。生产者线程和用户线程都能被写道通用的 Channel API 中。根据给定的通道类型,相同的代码可以被用来写数据到一个文件、socket 或管道。选择器可以被用来检查管道上的数据可用性,如同在 socket 通道上使用那样地简单。这样就可以允许单个用户线程使用一个 Selector 来从多个通道有效地收集数据,并可任意结合网络连接或本地工作线程使用。

管路所能承载的数据量是依赖实现的(implementation-dependent)。唯一可保证的是写到 SinkChannel 中的字节都能按照同样的顺序在 SourceChannel 上重现。

Show Disqus Comments

Search

    Table of Contents