NIO 三大核心组件
Java NIO(New IO / Non-blocking IO)是非阻塞、面向缓冲区 的 IO 模型,核心就是 3 个组件 :
Channel(通道) + Buffer(缓冲区) + Selector(选择器)
一、三大核心组件总览
| 组件 | 作用 | 一句话理解 |
|---|---|---|
| Buffer(缓冲区) | 数据读写的载体 | 数据的"集装箱",所有读写都必须经过它 |
| Channel(通道) | 数据传输的通道 | 数据的"高速公路",连接文件/网络 |
| Selector(选择器) | 监听多路通道 | 一个线程管理成千上万个连接的"总管" |
二、逐组件详解
1. Buffer(缓冲区)
核心:NIO 所有数据都通过 Buffer 读写
- 本质:一块可读写的内存数组
- 方向:Channel ↔ Buffer(双向传输)
- 对比 BIO:BIO 直接操作流,NIO 必须先放 Buffer
重要属性
capacity:容量(固定)position:当前读写位置limit:读写上限
常用类型
ByteBuffer(最常用,网络通信)IntBuffer、LongBuffer、CharBuffer等
核心方法
java
buffer.put() // 写入数据
buffer.flip() // 切换为读模式(关键!)
buffer.get() // 读取数据
buffer.clear() // 清空,准备下次写入
2. Channel(通道)
核心:数据传输的通道,双向、非阻塞、可异步
- 像"流",但比流强大 :
- 可以读也可以写(流单向)
- 可以异步读写
- 必须配合 Buffer 使用
常用 Channel
SocketChannel:TCP 客户端ServerSocketChannel:TCP 服务端FileChannel:文件 IO
工作模式
客户端 → Channel → Buffer → 服务端
服务端 → Buffer → Channel → 客户端
3. Selector(选择器)【NIO 灵魂】
核心:一个线程管理多个 Channel,实现 IO 多路复用
- 作用:监听多个通道的事件(连接、接收、读、写)
- 优势:
- 单线程 → 管理上万连接
- 资源消耗极低
- 高并发网络编程必备
监听 4 种事件
OP_ACCEPT:有新连接OP_CONNECT:连接成功OP_READ:有数据可读OP_WRITE:可写数据
工作流程
- 把多个 Channel 注册到 Selector
- Selector 阻塞等待事件
- 有事件触发 → 处理对应 Channel
- 循环执行
三、三者关系图(极简版)
一个 Selector
↓ 管理
多个 Channel(连接)
↓ 传输
Buffer(数据载体)
一句话总结三者关系:
Selector 管理多个 Channel,每个 Channel 读写数据都必须通过 Buffer。
四、NIO 核心优势
- 非阻塞:连接不读写时,线程不会阻塞
- IO 多路复用:单线程管理海量连接
- 面向缓冲区:数据读写更高效
- 高并发、低资源:适合高性能服务器
总结
- Buffer:装数据
- Channel:传数据
- Selector:管连接