请参见:
描述
接口摘要 | |
---|---|
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 | 表示 SelectableChannel 在 Selector 中的注册的标记。 |
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 方法的情况下调用 SocketChannel 的 finishConnect 方法时,抛出此未经检查的异常。 |
NonReadableChannelException | 试图对一个最初未允许对其进行读取操作的通道进行读取时,抛出此未经检查的异常。 |
NonWritableChannelException | 试图对一个最初未允许对其进行写入操作的通道进行写入时,抛出此未经检查的异常。 |
NotYetBoundException | 试图在尚未绑定的服务器套接字通道上调用 I/O 操作时,抛出此未经检查的异常。 |
NotYetConnectedException | 试图在尚未连接的套接字通道上调用 I/O 操作时,抛出此未经检查的异常。 |
OverlappingFileLockException | 试图获取某个文件区域上的锁定,而该区域与同一 Java 虚拟机已锁定的某个区域重叠时,或者当另一个线程已经等待锁定同一文件的重叠区域时,抛出此未经检查的异常。 |
UnresolvedAddressException | 试图对未解析的套接字地址调用网络操作时,抛出此未经检查的异常。 |
UnsupportedAddressTypeException | 试图绑定或连接到一个其类型不受支持的套接字地址时,抛出此未经检查的异常。 |
定义了各种通道,这些通道表示到能够执行 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
子类。
除非另行说明,否则将 null 参数传递给此包中任何类或接口的构造方法或方法将会导致抛出 NullPointerException
。