java.nio.channels
用于I/O 操作连接,读入缓冲区的程序
java.nio.channels定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。
通道描述
Channel 用于 I/O 操作的连接
ReadableByteChannel 可以将内容读入缓冲区
ScatteringByteChannel 可以将内容读入缓冲区序列
WritableByteChannel 可以从缓冲区中写入内容
GatheringByteChannel 可以从缓冲区序列中写入内容
ByteChannel 可以从缓冲区读取内容或向其写入内容
Channels 用于通道/流进行互操作的实用工具方法
通道定义
表示到实体(如硬件设备、文件、网络套接字或者可以执行一个或多个诸如读取或写入之类的不同 I/O 操作的程序组件)的开放连接。正如在 Channel 接口中所指定的,通道可以处于打开或关闭状态,并且它们既是可异步关闭的,又是可中断的。
多个其他接口扩展了 Channel 接口,这些接口都指定了新的 I/O 操作。
ReadableByteChannel 接口指定了 read 方法,可将字节从通道读取到缓冲区;类似地,WritableByteChannel 接口指定了 write 方法,可将字节从缓冲区写入通道。ByteChannel 接口为可读取和写入字节的常见通道统一了这两个接口。
ScatteringByteChannel 和 GatheringByteChannel 接口分别扩展了 ReadableByteChannel 和 WritableByteChannel 接口,添加的 read 和 write 方法采用的是缓冲区序列,而不只是单个缓冲区。
Channels 实用工具类定义了各种静态方法,这些方法支持 java io 包的流类和此包通道类的互操作。可根据 InputStream 或 OutputStream 构造合适的通道,反之可根据通道构造 InputStream 或 OutputStream。可构造 Reader 来使用给定的字符集对来自给定可读取字节通道的字节进行解码,反之可构造 Writer 来使用给定的字符集将字符编码到字节中,并将该字节写入给定的可写入字节通道。
文件通道
描述
FileChannel 读取、写入、映射和操作文件
FileLock 对文件(文件区域)的锁定
MappedByteBuffer 映射到文件区域的直接字节缓冲区
FileChannel 类支持从连接到文件的通道读取字节或向其写入字节,以及查询和修改当前的文件位置和将文件截取为指定大小等常见操作。它定义了在整个文件或具体文件区域上获取锁定的方法;这些方法返回 FileLock 类的实例。最后,它定义了对要写入到存储设备的文件进行强行更新的方法、在文件和其他通道之间高效传输字节的方法,以及将文件区域直接映射到内存中的方法。最后一个操作创建 MappedByteBuffer 类的实例,该实例扩展了 ByteBuffer 类,具有多种文件相关的操作。
已经向 java io 包的每个 FileInputStream、FileOutputStream 和 RandomAccessFile 类添加了 getChannel 方法。在这些类的某个类的实例上调用此方法将返回一个连接到基础文件的文件通道。
多路复用
非阻塞 I/O
描述
SelectableChannel 可实现多路复用的通道
DatagramChannel java .net.DatagramSocket 通道
Pipe.SinkChannel 对管道的写入结束
Pipe.SourceChannel 对管道的读取结束
ServerSocketChannel java .net.ServerSocket 通道
SocketChannel java .net.Socket 通道
Selector 可选择通道的多路复用器
SelectionKey 表示通道注册到选择器的标记
Pipe 形成单向管道的两个通道
多路复用的非阻塞 I/O 比面向线程的阻塞 I/O 的可伸缩性更好,由选择器、可选择通道 和选择键 提供。
选择器 是可选择通道 的多路复用器,它是可被置于非阻塞模式 的特殊类型的通道。要执行多路复用的 I/O 操作,首先要创建一个或多个可选择通道、将其置于非阻塞模式,并将注册 到选择器注册一个通道会指定一组由选择器测试其是否准备就绪的 I/O 操作,并返回一个表示该注册的选择键。
一旦已经向选择器注册了通道,就可执行选择操作 以发现哪些通道(如果有)已经准备好执行先前已声明感兴趣的一个或多个操作。如果某个通道已准备就绪,则将注册时所返回的键添加到该选择器的已选择键集中。为了确定每个通道已准备好执行哪些操作,可以检查该键集和其中的键。为了执行所需的任何 I/O 操作,可根据每个键检索相应的通道。
指示其通道对某个操作已准备就绪的选择键只是一个提示,并不保证线程执行此种操作而不导致被阻塞。为了在这些提示证明不正确时忽略这些提示,则要强制写入负责执行多路复用 I/O 操作的代码。
此包定义了与 java .net 包中定义的 DatagramSocket、ServerSocket 和 Socket 类相对应的可选择通道类。为了支持与通道相关的套接字,已经对这些类进行了较小的更改。此包还定义了实现单向管道的简单类。在所有情况下,都是通过调用相应类的静态 open 方法来创建新的可选择通道。如果某个通道需要一个关联的套接字,则此操作同时也创建一个套接字。
可通过“插入”一个在 java.nio.channels.spi 包中定义的 SelectorProvider 类的替代定义或实例来替换选择器、可选通道和选择键的实现。并不期望很多开发人员都会实际使用这些设施;提供它的主要目的是为了在需要极高的性能时,能够让经验丰富的用户能充分利用特定于操作系统的 I/O 多路复用机制。
实现多路复用 I/O 抽象所要求的很多簿记和同步任务由 java.nio.channels.spi 包中的 AbstractInterruptibleChannel、AbstractSelectableChannel、AbstractSelectionKey 和 AbstractSelector 类来执行。在定义一个自定义的选择器提供程序时,应该只直接扩展 AbstractSelector 和 AbstractSelectionKey 类;自定义通道类应该扩展此包中定义的适当 SelectableChannel 子类。
从以下版本开始:
1.4
参考资料
最新修订时间:2022-05-08 12:56
目录
概述
通道描述
通道定义
参考资料