基本概念:
java.nio 包: 基于非阻塞的面相缓存区以及通道的java IO 处理工具包,其最大的优势是引入的buffer和channel的概念,并且通过选择器操作多个流,基于非阻塞处理方式,提高传统IO的效率。
NIO 与IO 的主要区别
Buffer
可以理解成一个容器,缓存的作用,有以下几个概念:
- capacity:大小
- limit: 可访问区大小
- position:当前指向的数据
- mark && reset: 类似打标签回滚
非直接缓冲区
直接缓冲区
Channel
数据间的通道,可以理解成网线、水管等。Channel 只能与 Buffer 进行交互。
- FileChannel: 用于读取、写入、映射和操作文件的通道。
- DatagramChannel: 通过UDP 读写网络中的数据通道。
- SocketChannel: 通过TCP 读写网络中的数据。
- ServerSocketChannel: 监听TCP 连接,对每一个新链接创建SocketChannel,用于服务器端。
Selectors
Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
可以监听的事件类型(可使用SelectionKey 的四个常量表示):
- 读: SelectionKey.OP_READ (1)
- 写: SelectionKey.OP_WRITE (4)
- 连接: SelectionKey.OP_CONNECT(8)
- 接收: SelectionKey.OP_ACCEPT (16)
NIO的非阻塞能力正是通过Selectors来实现的。
Scatter / Gather
通过channel可以通过操作多个Buffer,减少过于细粒度的操作对于设备的频繁访问,以提高操作效率。
Pipe
Pipe是2个线程之间的单向数据连接,Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。双向连接时可以定义两个反向的Pipe。
Paths
java.nio.file.Path 接口代表一个平台无关的平台路径,描述了目录结构中文件的位置
Files
java.nio.file.Files 用于操作文件或目录的工具类。
网友评论