Java IO 专题:BIO、NIO、AIO、IO 模型与设计模式
IO 专题内容多且互相咬合:流 API、操作系统 IO 模型、NIO 三件套、Netty 框架,单看任何一块都容易迷失。这篇学习地图先按主题分组,再理清依赖关系,最后给出推荐顺序,帮你把零散的知识点串成一条线。
主题分组
流基础(java.io)
这是整个专题的地基,目标是熟练使用面向流的 API 完成日常读写:
- 字节流与字符流:解决”数据以什么粒度进出程序”的问题——字节流通吃一切,字符流专门处理文本编码。
- 缓冲流:解决”如何减少系统调用次数”的问题,是性能优化第一课。
- IO 设计模式:解决”几十个类为什么这样组织”的问题,装饰器与适配器是读懂类库的两把钥匙。
- 文件操作与序列化:解决”对象与文件如何互相转换”的问题。
NIO(java.nio)
针对流模型在高并发网络场景下的痛点而设计:
- Buffer / Channel / Selector 三件套:解决”如何用少量线程管理大量连接”的问题,是 NIO 编程的核心。
- NIO.2 的 Path 与 Files:解决”老 File API 难用”的问题,文件操作从此有了像样的工具类。
模型与框架
把视角从 Java API 抬升到操作系统与框架层:
- BIO / NIO / AIO 与 IO 多路复用:解决”阻塞/非阻塞、同步/异步到底在说什么”的问题,select、poll、epoll 的区别也在这一层。
- Reactor 与 Netty:解决”理论如何落地成高性能网络框架”的问题,看 EventLoop 如何封装底层多路复用。
依赖关系
几组关键的依赖链:
- 设计模式依附于流类库,不懂流就谈不上理解包装链,所以流基础在前。
- NIO 是对流模型痛点的回应,先体会 BIO 一对一模型的瓶颈,才能明白 Selector 的意义。
- Selector 本质是 epoll/kqueue 的 Java 封装,所以 IO 多路复用的概念要先于 NIO 源码细节。
- Netty 站在 NIO 与 Reactor 之上,放在最后看才不费力。
推荐学习顺序
- 过一遍流体系,能熟练使用 try-with-resources 读写文件与文本。
- 看 IO 设计模式,理解装饰器的包装链与适配器的编解码角色。
- 学 IO 模型,建立操作系统视角,分清阻塞、非阻塞与多路复用。
- 啃 NIO 三件套,动手写一个基于 Selector 的非阻塞 Echo Server。
- 对照 Netty 源码收尾,把前面所有概念在框架里对号入座。
一句话速查表
| 主题 | 解决什么问题 |
|---|---|
| 字节流 / 字符流 | 数据以什么粒度进出程序 |
| 缓冲流 | 如何减少系统调用次数 |
| IO 设计模式 | 类库为何这样组织 |
| IO 模型 | 线程与内核如何协作等待数据 |
| IO 多路复用 | 一个线程如何盯住上万个连接 |
| Buffer / Channel / Selector | NIO 的数据容器、传输通道与事件分发器 |
| Reactor / Netty | 把多路复用工程化成可用框架 |
自检
学完全部内容后,试着回答三个问题:缓冲流为什么快?select、poll、epoll 差在哪?能否徒手写出 Selector 的注册—轮询循环?三个都能讲清楚,这张地图就算走完了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dai Wei!
评论

