Package java.nio.channels
通道 | 描述 |
---|---|
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
接口,用于查询
和修改
通道的当前位置,以及其大小
。
ScatteringByteChannel
和GatheringByteChannel
接口分别扩展了ReadableByteChannel
和WritableByteChannel
接口,添加了read
和write
方法,这些方法接受一个序列的缓冲区而不是单个缓冲区。
NetworkChannel
接口指定了方法来绑定
通道的套接字,获取套接字绑定的地址,以及获取
和设置
套接字选项的方法。MulticastChannel
接口指定了加入Internet协议(IP)多播组的方法。
Channels
实用类定义了静态方法,支持该包的通道类与java.io
包的流类之间的互操作。可以从InputStream
或OutputStream
构造适当的通道,反之亦然,可以从通道构造InputStream
或OutputStream
。可以构造一个使用给定字符集从给定可读字节通道解码字节的Reader
,反之亦然,可以构造一个使用给定字符集将字符编码为字节并将其写入给定可写字节通道的Writer
。
文件通道 | 描述 |
---|---|
FileChannel |
读取、写入、映射和操作文件 |
FileLock |
文件(区域)上的锁 |
MappedByteBuffer |
直接映射到文件区域的直接字节缓冲区 |
FileChannel
类支持从连接到文件的通道读取字节、写入字节的常规操作,以及查询和修改当前文件位置以及将文件截断为特定大小的操作。它定义了用于在整个文件或文件特定区域上获取锁的方法;这些方法返回FileLock
类的实例。最后,它定义了将文件更新强制写入包含文件的存储设备、在文件和其他通道之间高效传输字节以及将文件区域直接映射到内存的方法。
FileChannel
通过调用其静态的open
方法之一创建,或者通过调用FileInputStream
、FileOutputStream
或RandomAccessFile
的getChannel
方法返回连接到与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
包中定义的DatagramSocket
、ServerSocket
和Socket
类对应的可选择通道类。为了支持与通道关联的套接字,对这些类进行了轻微更改。此包还定义了一个实现单向管道的简单类。在所有情况下,通过调用相应类的静态open
方法来创建新的可选择通道。如果通道需要关联的套接字,则将作为此操作的副作用创建套接字。
DatagramChannel
、SocketChannel
和ServerSocketChannel
可以使用不同的协议族
创建。标准的协议族类型在StandardProtocolFamily
中指定。
用于Internet Protocol套接字的通道使用INET
或INET6
协议族创建。Internet Protocol套接字支持使用TCP和UDP进行网络通信,并使用封装IP地址和端口号的InetSocketAddress
进行寻址。当在通道工厂创建方法中未指定协议族时,默认创建Internet Protocol套接字。
用于Unix Domain套接字的通道使用UNIX
协议族创建。Unix Domain套接字支持在同一主机上进行本地进程间通信,并使用封装本地系统上的文件系统路径名的UnixDomainSocketAddress
进行寻址。
选择器、可选择通道和选择键的实现可以通过在SelectorProvider
类中定义的替代定义或实例进行“插入”。不希望许多开发人员实际使用此功能;主要提供此功能是为了使高级用户能够利用操作系统特定的I/O多路复用机制,以实现非常高的性能。
实现多路复用I/O抽象所需的大部分簿记和同步由AbstractInterruptibleChannel
、AbstractSelectableChannel
、AbstractSelectionKey
和AbstractSelector
类在java.nio.channels.spi
包中执行。在定义自定义选择器提供程序时,只应直接对AbstractSelector
和AbstractSelectionKey
类进行子类化;自定义通道类应扩展此包中定义的适当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
-
ClassDescription当尝试在通道上启动接受操作并且先前的接受操作尚未完成时抛出的未经检查的异常。当尝试绑定已经绑定的网络定向通道的套接字时抛出的未经检查的异常。当尝试连接已经连接的
SocketChannel
时抛出的未经检查的异常。可以读取和写入字节的异步通道。支持异步I/O操作的通道。为资源共享而组合的异步通道组。当另一个线程关闭通道或阻塞在I/O操作中的通道部分时,接收到的已检查异常。用于读取、写入和操作文件的异步通道。用于面向流的监听套接字的异步通道。用于面向流的连接套接字的异步通道。可以读取和写入字节的通道。当尝试使用不再有效的选择键时抛出的未经检查的异常。I/O操作的中心。通道和流的实用方法。当另一个线程在通道上阻塞时中断它时接收到的已检查异常。当尝试在关闭的通道上调用或完成I/O操作时抛出的已检查异常,或者至少关闭了该操作。当尝试在关闭的选择器上调用I/O操作时抛出的未经检查的异常。CompletionHandler<V,A> 用于消耗异步I/O操作结果的处理程序。当尝试连接已经在进行非阻塞连接操作的SocketChannel
时抛出的未经检查的异常。用于数据报导向套接字的可选择通道。用于读取、写入、映射和操作文件的通道。文件映射模式。表示文件区域上锁的令牌。当另一个线程在等待获取文件锁时中断它时接收到的已检查异常。可以从一系列缓冲区中写入字节的通道。当在不正确的阻塞模式下调用特定于阻塞模式的操作时抛出的未经检查的异常。当尝试在非由相同提供者创建的组中打开通道时抛出的未经检查的异常。当尝试使用非由创建通道的提供者创建的选择器注册通道时抛出的未经检查的异常。当异步操作完成之前超时时接收到的已检查异常。可以异步关闭和中断的通道。表示Internet协议(IP)多播组成员资格的令牌。支持Internet协议(IP)多播的网络通道。到网络套接字的通道。当在未成功调用connect
方法之前调用finishConnect
方法时抛出的未经检查的异常。当尝试从最初未打开用于读取的通道读取时抛出的未经检查的异常。当尝试向最初未打开用于写入的通道写入时抛出的未经检查的异常。当尝试在尚未绑定的服务器套接字通道上调用I/O操作时抛出的未经检查的异常。当尝试在尚未连接的套接字通道上调用I/O操作时抛出的未经检查的异常。当尝试在与同一Java虚拟机已锁定的文件区域重叠的文件区域上获取锁时抛出的未经检查的异常,或者当另一个线程已经等待锁定同一文件的重叠区域时。实现单向管道的一对通道。表示Pipe
的可写端的通道。表示Pipe
的可读端的通道。可以读取字节的通道。当尝试从异步套接字通道读取且先前的读取尚未完成时抛出的未经检查的异常。可以将字节读入一系列缓冲区的通道。保持当前位置并允许更改位置的字节通道。可以通过Selector
进行多路复用的通道。表示SelectableChannel
与Selector
注册的令牌。SelectableChannel
对象的多路复用器。用于面向流的监听套接字的可选择通道。当尝试构造在关闭的组中或无法调用I/O操作的完成处理程序因为通道组已终止时抛出的未经检查的异常。用于面向流的连接套接字的可选择通道。当尝试在未解析的套接字地址上执行网络操作时抛出的未经检查的异常。当尝试绑定或连接到不受支持的类型的套接字地址时抛出的未经检查的异常。可以写入字节的通道。当尝试向异步套接字通道写入且先前的写入尚未完成时抛出的未经检查的异常。