java.nio.channels包中含有一个名为Pipe(管道)的类。广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管。管道的概念对于Unix(和类Unix)操作系统的用户来说早就很熟悉了

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

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客户端中断请求导致服务端管道破裂 java 断开的管道_工具类

Pipe的source通道和sink通道提供类似java.io.PipedInputStream和java.io.PipedOutputStream所提供的功能,不过它们可以执行全部的通道语义

SinkChannel和SourceChannel都继承了AbstractSelectableChannel(所以也间接地继承了SelectableChannel),这意味着pipe通道可以同选择器一起使用(参见第四章)。

2:通道工具类

NIO通道提供了一个全新的类似流的I/O隐喻,但是我们所熟悉的字节流以及字符读写器仍然存在并被广泛使用。通道可能最终会改进加入到java.io类中(这是一个实现细节),但是java.io流所代表的API和读写器却不会很快消失(它们也不应该消失)。

java客户端中断请求导致服务端管道破裂 java 断开的管道_工具类

java客户端中断请求导致服务端管道破裂 java 断开的管道_工具类

3.8 总结

本章中我们讨论了通道的很多方面的内容。通道组成了基础设施或者说管道设施,该设施在操作系统(或通道连接到的任意东西)的ByteBuffers和I/O服务之间传输数据。本章中讨论到的关键概念有:

基本的通道操作

在3.1节中我们学习了通道的基本操作,具体包括:怎样使用所有通道都通用的API方法调用来打开一个通道以及完成操作时如何关闭通道。

Scatter/Gather通道

在3.2节中我们介绍了如何使用通道来scatter/gather

I/O。矢量化的I/O使您可以在多个缓冲区上自动执行一个I/O操作。

文件通道

在3.3节中我们讨论了多层面的FileChannel类。这个强大的新通道提供了对高级文件操作的访问,以前这是不对Java编程开放的。新的功能特性包括:文件锁定、内存映射文件以及channel-to-channel传输。

Socket通道

在3.5节中我们覆盖了几种类型的socket通道。同时,我们也讨论了socket通道所支持的一个重要新特性——非阻塞模式。

管道

在3.6节中我们看了一下Pipe类,这是一个使用专门的通道实现的新循环机制,非常有用。

通道工具类

通道类中包含了工具方法,这些方法用于交叉连接通道和常规的字节流以及字符读写器对象。