Java 中的 NIO(New I/O,从 JDK 1.4 引入) 和 传统 IO(BIO,Blocking I/O) 在模型、性能、适用场景上都有明显区别。下面从多个维度对比说明。
| 对比项 | 传统 IO(BIO) | NIO |
|---|---|---|
| 全称 | Blocking I/O | New I/O / Non-blocking I/O |
| 是否阻塞 | 阻塞 | 可非阻塞 |
| 面向 | 流(Stream) | 缓冲区(Buffer)+ 通道(Channel) |
| 线程模型 | 一连接一线程 | 少量线程处理多连接 |
| 底层机制 | 流读写 | 选择器(Selector) |
Socket socket = serverSocket.accept(); // 阻塞
InputStream in = socket.getInputStream();
in.read(); // 阻塞
accept()、read()、write() 都会阻塞线程✅ 编程模型简单
✅ 容易理解和调试
❌ 高并发时线程数爆炸
❌ 线程切换开销大
❌ 不适合大量长连接
selector.select(); // 监听多个通道
Selector 实现事件驱动Selector selector = Selector.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
✅ 高并发、低资源消耗
✅ 适合长连接、聊天、网关
✅ Netty 等框架基础
❌ 编程复杂
❌ 调试困难
❌ 需理解事件模型
| 场景 | 推荐 |
|---|---|
| 低并发、简单服务 | 传统 IO |
| 文件拷贝、一次性读写 | 传统 IO |
| 高并发服务器 | NIO |
| 聊天室 / 网关 / RPC | NIO |
| 百万连接 | NIO + Netty |
传统 IO 是“一个连接一个线程”,NIO 是“一个线程管一堆连接”。
如果你愿意,我也可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。