模块 java.base

包 java.nio.channels


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

A channel表示与硬件设备、文件、网络套接字或能够执行一个或多个不同 I/O 操作(例如读取或写入)的程序组件等实体的开放连接。在Channel 接口中指定,通道要么打开要么关闭,它们都是异步关闭可中断的.

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

ReadableByteChannel 接口指定了一个 read 方法,该方法将字节从通道读取到缓冲区中;类似地,WritableByteChannel 接口指定了一个 write 方法,该方法将字节从缓冲区写入通道。 ByteChannel 接口统一了这两个接口,适用于可以读取和写入字节的通道的常见情况。 SeekableByteChannel 接口将 ByteChannel 接口的方法扩展到 query modify 通道的当前位置及其 size

ScatteringByteChannel GatheringByteChannel 接口分别扩展了 ReadableByteChannel WritableByteChannel 接口,添加了 read write 方法,这些方法采用一系列缓冲区而不是单个缓冲区。

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

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

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

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

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

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

多路复用的非阻塞 I/O,比面向线程的阻塞 I/O 更具可扩展性,由选择器, 可选通道, 和选择键.

selector可选通道 的多路复用器,后者又是一种特殊类型的通道,可以放入 非阻塞模式 中。要执行多路复用 I/O 操作,首先创建一个或多个可选通道,将其置于非阻塞模式,并使用选择器registered 。注册一个通道指定了一组 I/O 操作,这些操作将由选择器测试准备就绪,并返回一个代表注册的 选择键

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

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

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

DatagramChannel SocketChannel ServerSocketChannel 可以使用不同的 protocol families 创建。 StandardProtocolFamily 中指定了标准族类型。

渠道互联网协议套接字是使用 INET INET6 协议系列创建的。互联网协议套接字支持使用 TCP 和 UDP 的网络通信,并使用封装 IP 地址和端口号的 InetSocketAddress es 进行寻址。互联网协议当通道工厂创建方法中未指定协议族时,套接字也是创建的默认类型。

的通道Unix域套接字是使用 UNIX 协议系列创建的。Unix域套接字支持同一主机上的本地进程间通信,并使用 UnixDomainSocketAddress es 寻址,它封装了本地系统上的文件系统路径名。

选择器、可选通道和选择键的实现可以通过“插入”在 java.nio.channels.spi 包中定义的 SelectorProvider 类的替代定义或实例来替换。预计不会有很多开发人员实际使用此功能;提供它主要是为了让经验丰富的用户在需要非常高的性能时可以利用操作系统特定的 I/O 多路复用机制。

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

列出异步通道及其描述
异步输入输出 Description
AsynchronousFileChannel 用于读取、写入和操作文件的异步通道
AsynchronousSocketChannel 到面向流的连接套接字的异步通道
AsynchronousServerSocketChannel 面向流的监听套接字的异步通道
CompletionHandler 用于使用异步操作结果的处理程序
AsynchronousChannelGroup 以资源共享为目的的一组异步通道

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

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

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

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

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

自从:
1.4