java.nio.channels

接口
异常
定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。

请参见:
          描述

接口摘要
ByteChannel 可读取和写入字节的信道。
Channel 用于 I/O 操作的连接。
GatheringByteChannel 可从缓冲区序列写入字节的通道。
InterruptibleChannel 可被异步关闭和中断的通道。
ReadableByteChannel 可读取字节的通道。
ScatteringByteChannel 可将字节读入缓冲区序列的通道。
WritableByteChannel 可写入字节的通道。
 

类摘要
Channels 针对信道和流的实用工具方法。
DatagramChannel 针对面向数据报套接字的可选择通道。
FileChannel 用于读取、写入、映射和操作文件的通道。
FileChannel.MapMode 文件映射模式的类型安全的枚举。
FileLock 表示文件区域锁定的标记。
Pipe 实现单向管道传送的通道对。
Pipe.SinkChannel 表示 Pipe 的可写入结尾的通道。
Pipe.SourceChannel 表示 Pipe 的可读取结尾的通道。
SelectableChannel 可通过 Selector 实现多路复用的通道。
SelectionKey 表示 SelectableChannelSelector 中的注册的标记。
Selector SelectableChannel 对象的多路复用器。
ServerSocketChannel 针对面向流的侦听套接字的可选择通道。
SocketChannel 针对面向流的连接套接字的可选择通道。
 

异常摘要
AlreadyConnectedException 试图对已经连接的 SocketChannel 进行连接时抛出的未经检查的异常。
AsynchronousCloseException 当在某个信道的 I/O 操作中处于阻塞状态的某个线程被另一个线程关闭了该信道或部分信道时,该信道所接收的经过检查的异常。
CancelledKeyException 当试图使用不再有效的选择键时,抛出此未经检查的异常。
ClosedByInterruptException 当在某个信道的 I/O 操作中处于阻塞状态的某个线程被另一个线程中断时,该线程将收到此经过检查的异常。
ClosedChannelException 当试图对已关闭的、或者至少对某个 I/O 操作已关闭的信道上调用或完成该操作时,抛出此经过检查的异常。
ClosedSelectorException 试图在已关闭的选择器上调用 I/O 操作时抛出的未经检查的异常。
ConnectionPendingException 试图连接一个正在进行非阻塞连接操作的 SocketChannel 时抛出的未经检查的异常。
FileLockInterruptionException 当某个线程正在等待获取文件锁定时被另一个线程中断,则由该线程接收此经过检查的异常。
IllegalBlockingModeException 当以错误的阻塞模式调用特定于某个阻塞模式的操作时,抛出此未经检查的异常。
IllegalSelectorException 试图将一个通道注册到一个不是由创建该通道的提供者所创建的选择器时,抛出此未经检查的异常。
NoConnectionPendingException 在没有首先成功调用 connect 方法的情况下调用 SocketChannelfinishConnect 方法时,抛出此未经检查的异常。
NonReadableChannelException 试图对一个最初未允许对其进行读取操作的通道进行读取时,抛出此未经检查的异常。
NonWritableChannelException 试图对一个最初未允许对其进行写入操作的通道进行写入时,抛出此未经检查的异常。
NotYetBoundException 试图在尚未绑定的服务器套接字通道上调用 I/O 操作时,抛出此未经检查的异常。
NotYetConnectedException 试图在尚未连接的套接字通道上调用 I/O 操作时,抛出此未经检查的异常。
OverlappingFileLockException 试图获取某个文件区域上的锁定,而该区域与同一 Java 虚拟机已锁定的某个区域重叠时,或者当另一个线程已经等待锁定同一文件的重叠区域时,抛出此未经检查的异常。
UnresolvedAddressException 试图对未解析的套接字地址调用网络操作时,抛出此未经检查的异常。
UnsupportedAddressTypeException 试图绑定或连接到一个其类型不受支持的套接字地址时,抛出此未经检查的异常。
 

软件包 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 接口为可读取和写入字节的常见通道统一了这两个接口。

ScatteringByteChannelGatheringByteChannel 接口分别扩展了 ReadableByteChannelWritableByteChannel 接口,添加的 readwrite 方法采用的是缓冲区序列,而不只是单个缓冲区。

Channels 实用工具类定义了各种静态方法,这些方法支持 java.io 包的流类和此包通道类的互操作。可根据 InputStreamOutputStream 构造合适的通道,反之可根据通道构造 InputStreamOutputStream。可构造 Reader 来使用给定的字符集对取自给定可读取字节通道的字节进行解码,反之可构造 Writer 来使用给定的字符集将字符编码到字节中,并将该字节写入给定的可写入字节通道。

文件通道

描述

FileChannel 读取、写入、映射和操作文件
FileLock 对文件(文件区域)的锁定
MappedByteBuffer   映射到文件区域的直接字节缓冲区

FileChannel 类支持从连接到文件的通道读取字节或向其写入字节,以及查询和修改当前的文件位置和将文件截取为指定大小等常见操作。它定义了在整个文件或具体文件区域上获取锁定的方法;这些方法返回 FileLock 类的实例。最后,它定义了对要写入到存储设备的文件进行强行更新的方法、在文件和其他通道之间高效传输字节的方法,以及将文件区域直接映射到内存中的方法。最后一个操作创建 MappedByteBuffer 类的实例,该实例扩展了 ByteBuffer 类,具有多种文件相关的操作。

已经向 java.io 包的每个 FileInputStreamFileOutputStreamRandomAccessFile 类添加了 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 包中定义的 DatagramSocketServerSocketSocket 类相对应的可选择通道类。为了支持与通道相关的套接字,已经对这些类进行了较小的更改。此包还定义了实现单向管道的简单类。在所有情况下,都是通过调用相应类的静态 open 方法来创建新的可选择通道。如果某个通道需要一个关联的套接字,则此操作同时也创建一个套接字。

可通过“插入”一个在 java.nio.channels.spi 包中定义的 SelectorProvider 类的替代定义或实例来替换选择器、可选通道和选择键的实现。并不期望很多开发人员都会实际使用这些设施;提供它的主要目的是为了在需要极高的性能时,能够让经验丰富的用户能充分利用特定于操作系统的 I/O 多路复用机制。

实现多路复用 I/O 抽象所要求的很多簿记和同步任务由 java.nio.channels.spi 包中的 AbstractInterruptibleChannelAbstractSelectableChannelAbstractSelectionKeyAbstractSelector 类来执行。在定义一个自定义的选择器提供者时,应该只直接扩展 AbstractSelectorAbstractSelectionKey 类;自定义通道类应该扩展此包中定义的适当 SelectableChannel 子类。

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

从以下版本开始:
1.4