一文彻底理解什么是 NIO
在学习本篇博文前,建议先学习本人博文 —— 《详解 IO流》
首先,本人来介绍下什么是NIO流:
概述:
NIO (NonBlocking IO)
是从 Java1.4 版本 引入的一个 新的IO概念
- NIO 支持 面向缓冲区、基于通道、同步非阻塞 的 IO操作
- NIO 将以 更加高效 的方式进行 文件读写、数据交互 等操作
区别:
那么,本人来讲解下 BIO
和 NIO
以及 未来可能会火的 AIO
,这三者之间的 区别:
BIO | NIO | AIO | |
---|---|---|---|
数据交互 | 面向 流 单向传输 |
面向 缓冲区 双向传输 |
面向 缓冲区 双向传输 |
IO模型 | 同步 阻塞(Blocking) 即:BIO |
同步 非阻塞(NonBlocking) 即:NIO |
异步(Async) 非阻塞(NonBlocking) 即:AIO |
可靠性 | 差 | 好 | 好 |
吞吐量 | 低 | 高 | 高 |
编程难度 | 简单 | 复杂 | 复杂 |
对于上述的 数据交互 的区别,可能会有同学不明白
那么,本人就以两张图,来展示下 BIO
和 NIO
在 数据交互 方面的 区别:
数据交互·图解:
BIO —— 面向“流”:
NIO —— 面向“缓冲区”:
我们从上述两图,也能看得出:
- 面向 “流”,即:
数据交互 的 基本单位 是 字节流,且 信息传输通道 是 单向 的- 面向 “缓冲区”,即:
数据交互 的 基本单位 是 缓冲区,且 信息传输通道 是 双向 的
NIO
相较于 BIO
,性能如此卓越,主要依赖其 三大核心组件:
三大核心组件:
- 通道 (Channel)
- 缓冲区(Buffer)
- 多路复用选择器(Selector)
Channel | Buffer | Selector | |
---|---|---|---|
功能 | 数据传输 | 数据存储 | 事件监听 |
接下来,本人现在就通过几篇博文来讲解下这 三个核心组件 的 使用 以及 原理:
首先是 缓冲区(Buffer):
缓冲区 (Buffer):
请观看本人博文 —— 《【NIO】Buffer 详解》
接下来,是 通道 (Channel):
通道 (Channel):
请观看本人博文 —— 《【NIO】Channel 详解》
最后,是NIO最最最最最重要的组件 —— 多路复用选择器(Selector):
多路复用选择器 (Selector):
请观看本人博文 —— 《【NIO】Selector 详解》
最后本人再来进行扩展,讲解下 用NIO实现的、具有文件传输功能 的 Paths类 和 Files类:
扩展 —— Paths类 和 Files类:
请观看本人博文 —— 《详解 Paths类 与 Files类》