内容目录
3.1 通道基础
首先,我们来更近距离地看一下基本的 Channel 接口。下面是 Channel 接口的完整源码:
package java.nio.channels;
public interface Channel
{
public boolean isOpen();
public void close() throws IOException;
}
与缓冲区不同,通道 API 主要由接口指定。不同的操作系统上通道实现(Channel Implementation)会有根本性的差异,所以通道 API 仅仅描述了可以做什么。因此很自然地,通道实现经常使用操作系统的本地代码。通道接口允许您以一种受控且可移植的方式来访问底层的 I/O服务。
您可以从顶层的Channel
接口看到,对所有通道来说只有两种共同的操作:检查一个通道是否打开(isOpen()
)和关闭一个打开的通道(close()
)。图 3-2 显示,所有有趣的东西都是那些实现Channel接口以及它的子接口的类。
InterruptibleChannel
是一个标记接口,当被通道使用时可以标示该通道是可以中断的(Interruptible)。如果连接可中断通道的线程被中断,那么该通道会以特别的方式工作,关于这一点我们会在 3.1.3 节中进行讨论。大多数但非全部的通道都是可以中断的。
从 Channel 接口引申出的其他接口都是面向字节的子接口,包括 WritableByteChannel
和ReadableByteChannel
。这也正好支持了我们之前所学的:通道只能在字节缓冲区上操作。层次结构表明其他数据类型的通道也可以从Channel
接口引申而来。这是一种很好的类设计,不过非字节实现是不可能的,因为操作系统都是以字节的形式实现底层 I/O 接口的。
观察图 3-2,您还会发现类层次结构中有两个类位于一个不同的包:
java.nio.channels.spi
。这两个类是AbstractInterruptibleChannel
和AbstractSelectableChannel
,它们分别为可中断的(interruptible)和可选择的(selectable)的通道实现提供所需的常用方法。尽管描述通道行为的接口都是在 java.nio.channels 包中定义的,不过具体的通道实现却都是从java.nio.channels.spi
中的类引申来的。这使得他们可以访问受保护的方法,而这些方法普通的通道用户永远都不会调用。
作为通道的一个使用者,您可以放心地忽视 SPI 包中包含的中间类。这种有点费解的继承层次只会让那些使用新通道的用户感兴趣。SPI 包允许新通道实现以一种受控且模块化的方式被植入到Java 虚拟机上。这意味着可以使用专为某种操作系统、文件系统或应用程序而优化的通道来使性能最大化。
0 条评论
撰写评论