Module java.base

Package java.nio.channels


package java.nio.channels
定义通道,表示连接到能够执行I/O操作的实体的连接,例如文件和套接字;定义选择器,用于多路复用的非阻塞I/O操作。
列出通道及其描述
通道 描述
Channel 用于I/O操作的连接点
ReadableByteChannel 可以读取到缓冲区中
ScatteringByteChannel 可以读取到一系列缓冲区中
WritableByteChannel 可以从缓冲区中写入
GatheringByteChannel 可以从一系列缓冲区中写入
ByteChannel 可以从缓冲区中读取/写入
SeekableByteChannel 连接到包含可变长度字节序列的实体的ByteChannel
AsynchronousChannel 支持异步I/O操作
AsynchronousByteChannel 可以异步读写字节
NetworkChannel 连接到网络套接字的通道
MulticastChannel 可以加入Internet协议(IP)多播组
Channels 通道/流互操作的实用方法

一个通道表示与实体(如硬件设备、文件、网络套接字或能够执行一个或多个不同I/O操作的程序组件)的开放连接。如在Channel接口中指定的那样,通道是打开或关闭的,并且它们既是异步可关闭的,也是可中断的。

Channel接口被几个其他接口扩展。

ReadableByteChannel接口指定了一个read方法,用于从通道读取字节到缓冲区中;类似地,WritableByteChannel接口指定了一个write方法,用于将字节从缓冲区写入通道。ByteChannel接口将这两个接口统一起来,用于通道既能读取又能写入字节的常见情况。SeekableByteChannel接口通过方法来扩展ByteChannel接口,用于查询修改通道的当前位置,以及其大小

ScatteringByteChannelGatheringByteChannel接口分别扩展了ReadableByteChannelWritableByteChannel接口,添加了readwrite方法,这些方法接受一个序列的缓冲区而不是单个缓冲区。

NetworkChannel接口指定了方法来绑定通道的套接字,获取套接字绑定的地址,以及获取设置套接字选项的方法。MulticastChannel接口指定了加入Internet协议(IP)多播组的方法。

Channels实用类定义了静态方法,支持该包的通道类与java.io包的流类之间的互操作。可以从InputStreamOutputStream构造适当的通道,反之亦然,可以从通道构造InputStreamOutputStream。可以构造一个使用给定字符集从给定可读字节通道解码字节的Reader,反之亦然,可以构造一个使用给定字符集将字符编码为字节并将其写入给定可写字节通道的Writer

列出文件通道及其描述
文件通道 描述
FileChannel 读取、写入、映射和操作文件
FileLock 文件(区域)上的锁
MappedByteBuffer 直接映射到文件区域的直接字节缓冲区

FileChannel类支持从连接到文件的通道读取字节、写入字节的常规操作,以及查询和修改当前文件位置以及将文件截断为特定大小的操作。它定义了用于在整个文件或文件特定区域上获取锁的方法;这些方法返回FileLock类的实例。最后,它定义了将文件更新强制写入包含文件的存储设备、在文件和其他通道之间高效传输字节以及将文件区域直接映射到内存的方法。

FileChannel通过调用其静态的open方法之一创建,或者通过调用FileInputStreamFileOutputStreamRandomAccessFilegetChannel方法返回连接到与java.io类相同底层文件的文件通道。

列出了多路复用、非阻塞通道及其描述
多路复用、非阻塞I/O 描述
SelectableChannel 可进行多路复用的通道
DatagramChannel 面向数据报的套接字通道
Pipe.SinkChannel 管道的写入端
Pipe.SourceChannel 管道的读取端
ServerSocketChannel 面向流的监听套接字通道
SocketChannel 面向流的连接套接字通道
Selector 可选择通道的多路复用器
SelectionKey 表示通道与选择器注册关系的标记
Pipe 形成单向管道的两个通道

多路复用、非阻塞I/O比面向线程、阻塞I/O更具可伸缩性,由选择器可选择通道选择键提供。

选择器是可选择通道的多路复用器,可选择通道是一种特殊类型的通道,可置于非阻塞模式。要执行多路复用I/O操作,首先创建一个或多个可选择通道,将其置于非阻塞模式,并使用选择器进行注册。注册通道指定选择器将测试就绪状态的I/O操作集,并返回表示注册的选择键。

一旦某些通道已向选择器注册,就可以执行选择操作,以发现哪些通道(如果有)已准备好执行先前声明兴趣的一个或多个操作。如果通道准备就绪,则在注册时返回的键将添加到选择器的已选择键集中。可以检查键集及其中的键,以确定每个通道准备好的操作。可以从每个键中检索相应的通道,以执行所需的任何I/O操作。

选择键指示其通道准备好执行某些操作是一个提示,但不是保证,线程可以执行该操作而不会导致线程阻塞。执行多路复用I/O的代码必须编写为在这些提示被证明不正确时忽略它们。

此包定义了与java.net包中定义的DatagramSocketServerSocketSocket类对应的可选择通道类。为了支持与通道关联的套接字,对这些类进行了轻微更改。此包还定义了一个实现单向管道的简单类。在所有情况下,通过调用相应类的静态open方法来创建新的可选择通道。如果通道需要关联的套接字,则将作为此操作的副作用创建套接字。

DatagramChannelSocketChannelServerSocketChannel可以使用不同的协议族创建。标准的协议族类型在StandardProtocolFamily中指定。

用于Internet Protocol套接字的通道使用INETINET6协议族创建。Internet Protocol套接字支持使用TCP和UDP进行网络通信,并使用封装IP地址和端口号的InetSocketAddress进行寻址。当在通道工厂创建方法中未指定协议族时,默认创建Internet Protocol套接字。

用于Unix Domain套接字的通道使用UNIX协议族创建。Unix Domain套接字支持在同一主机上进行本地进程间通信,并使用封装本地系统上的文件系统路径名的UnixDomainSocketAddress进行寻址。

选择器、可选择通道和选择键的实现可以通过在SelectorProvider类中定义的替代定义或实例进行“插入”。不希望许多开发人员实际使用此功能;主要提供此功能是为了使高级用户能够利用操作系统特定的I/O多路复用机制,以实现非常高的性能。

实现多路复用I/O抽象所需的大部分簿记和同步由AbstractInterruptibleChannelAbstractSelectableChannelAbstractSelectionKeyAbstractSelector类在java.nio.channels.spi包中执行。在定义自定义选择器提供程序时,只应直接对AbstractSelectorAbstractSelectionKey类进行子类化;自定义通道类应扩展此包中定义的适当SelectableChannel子类。

列出了异步通道及其描述
异步I/O 描述
AsynchronousFileChannel 用于读取、写入和操作文件的异步通道
AsynchronousSocketChannel 用于流式连接套接字的异步通道
AsynchronousServerSocketChannel 用于流式监听套接字的异步通道
CompletionHandler 用于消费异步操作结果的处理程序
AsynchronousChannelGroup 用于资源共享目的的异步通道组

异步通道是一种特殊类型的通道,能够进行异步I/O操作。异步通道是非阻塞的,并定义了启动异步操作的方法,返回表示每个操作挂起结果的Future。可以使用Future来轮询或等待操作的结果。异步I/O操作还可以指定在操作完成时调用的CompletionHandler。完成处理程序是用户提供的代码,用于执行I/O操作的结果。

此包定义了连接到流式连接或监听套接字或数据报导向套接字的异步通道类。还定义了用于异步读取、写入和操作文件的AsynchronousFileChannel类。与FileChannel一样,它支持将文件截断为特定大小的操作,强制将文件更新写入存储设备,或在整个文件或文件特定区域上获取锁。与FileChannel不同的是,它不定义将文件区域直接映射到内存的方法。如果需要内存映射I/O,则可以使用FileChannel

异步通道绑定到异步通道组,以实现资源共享。一个组有一个关联的ExecutorService,任务将被提交到该服务以处理I/O事件,并将其分派给完成处理程序,这些处理程序消耗在组中的通道上执行的异步操作的结果。在创建通道时可以选择指定组,或者将通道绑定到默认组。高级用户可能希望创建自己的异步通道组或配置将用于默认组的ExecutorService

与选择器一样,异步通道的实现可以通过“插入”在AsynchronousChannelProvider类的替代定义或实例来替换,该类定义在java.nio.channels.spi包中。不希望许多开发人员实际使用此功能;主要提供此功能是为了使高级用户能够在需要非常高的性能时利用特定于操作系统的异步I/O机制。

除非另有说明,在此包中的任何类或接口的构造函数或方法中传递null参数将导致抛出NullPointerException

自从:
1.4