Module  java.base

Package java.nio.channels

定义通道,其表示与能够执行I / O操作的实体的连接,例如文件和套接字; 定义选择器,用于多路复用,非阻塞I / O操作。
Lists channels and their descriptions
Channels 描述
Channel A nexus for I/O operations
  ReadableByteChannel Can read into a buffer
    ScatteringByteChannel   Can read into a sequence of buffers
  WritableByteChannel Can write from a buffer
    GatheringByteChannel Can write from a sequence of buffers
  ByteChannel Can read/write to/from a buffer
    SeekableByteChannel A ByteChannel connected to an entity that contains a variable-length sequence of bytes
  AsynchronousChannel Supports asynchronous I/O operations.
    AsynchronousByteChannel Can read and write bytes asynchronously
  NetworkChannel A channel to a network socket
    MulticastChannel Can join Internet Protocol (IP) multicast groups
Channels Utility methods for channel/stream interoperation

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

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

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

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

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

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

Lists file channels and their descriptions
File channels 描述
FileChannel Reads, writes, maps, and manipulates files
FileLock A lock on a (region of a) file
MappedByteBuffer   A direct byte buffer mapped to a region of a file

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

FileChannel通过调用其静态之一创建open方法,或通过调用getChannel的方法FileInputStreamFileOutputStream ,或RandomAccessFile返回连接到相同的基本文件作为一个文件通道java.io类。

Lists multiplexed, non-blocking channels and their descriptions
Multiplexed, non-blocking I/O 描述
SelectableChannel A channel that can be multiplexed
  DatagramChannel A channel to a datagram-oriented socket
  Pipe.SinkChannel The write end of a pipe
  Pipe.SourceChannel The read end of a pipe
  ServerSocketChannel   A channel to a stream-oriented listening socket
  SocketChannel A channel for a stream-oriented connecting socket
Selector A multiplexor of selectable channels
SelectionKey A token representing the registration
of a channel with a selector
Pipe Two channels that form a unidirectional pipe

多路复用的非阻塞I / O由选择器可选择的通道选择键提供,它比面向线程的阻塞I / O更为可扩展。

A selectorselectable channels的多路复用 ,其又是可以放入non-blocking mode的特殊类型的信道。 要执行复用I / O操作,首先创建一个或多个可选通道,进入非阻塞模式,并选择registered 注册通道指定将通过选择器进行测试的I / O操作集,并返回表示注册的selection key

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

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

这个包定义对应于所述选择的信道的类DatagramSocketServerSocketSocket在定义的类java.net包。 为了支持与通道相关的套接字,已经对这些类进行了微小的更改。 该包还定义了一个实现单向管道的简单类。 在所有情况下,通过调用相应类的静态open方法创建新的可选通道。 如果一个通道需要相关的套接字,那么将创建一个套接字作为此操作的副作用。

可以通过“插入” java.nio.channels.spi定义的SelectorProvider类的替代定义或实例来替换选择器,可选通道和选择键的实现 预计很多开发人员实际上不会使用这个设施; 它主要提供,以便在需要非常高的性能时,复杂的用户可以利用操作系统特定的I / O复用机制。

多执行复用的I / O抽象所需的簿记和同步是由执行AbstractInterruptibleChannelAbstractSelectableChannelAbstractSelectionKeyAbstractSelector类在java.nio.channels.spi包。 定义一个自定义选择器提供者时,只有AbstractSelectorAbstractSelectionKey类应该直接进行子类化; 自定义渠道类应该扩展此包中定义的适当的SelectableChannel子类。

Lists asynchronous channels and their descriptions
Asynchronous I/O 描述
AsynchronousFileChannel An asynchronous channel for reading, writing, and manipulating a file
AsynchronousSocketChannel An asynchronous channel to a stream-oriented connecting socket
AsynchronousServerSocketChannel   An asynchronous channel to a stream-oriented listening socket
CompletionHandler A handler for consuming the result of an asynchronous operation
AsynchronousChannelGroup A grouping of asynchronous channels for the purpose of resource sharing

Asynchronous channels是能够进行异步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