Java NIO(Non-blocking I/O)详解
Java NIO(New I/O)是 Java 1.4 引入的高性能 I/O 框架,相比传统的 BIO(Blocking I/O),它提供了非阻塞、多路复用、零拷贝等能力,适用于高并发网络通信和文件操作。下面详细解析其核心概念和实现原理。
1. Java NIO 的核心组件
Java NIO 的核心由 Channel(通道)、Buffer(缓冲区)、Selector(选择器) 组成:
| 组件 | 作用 |
|---|---|
| Channel | 双向数据传输管道(类似流,但支持读写) |
| Buffer | 数据缓冲区(存储待发送或接收的数据) |
| Selector | 多路复用器,监听多个 Channel 的 I/O 事件(如读、写、连接) |
2. NIO 的工作流程
(1) 传统 BIO(阻塞 I/O)的问题
• 每个连接占用一个线程,线程切换开销大。
• 线程阻塞:当没有数据可读时,线程会一直等待,浪费 CPU 资源。
(2) NIO 的非阻塞模型
NIO 采用 事件驱动(Event-Driven) 的方式:
- Channel 注册到 Selector,并指定监听的事件(如
OP_READ、OP_WRITE)。 - Selector 轮询 所有注册的 Channel,返回就绪的事件。
- 线程处理就绪事件(如读取数据、写入数据),避免阻塞。
关键优化:
• 单线程可管理多个连接(减少线程数)。
• 非阻塞:没有数据时,线程可以处理其他任务。
3. NIO 的核心实现
(1) Channel(通道)
• SocketChannel:用于 TCP 网络通信(客户端/服务端)。
• ServerSocketChannel:服务端监听新连接。
• FileChannel:文件操作(支持 mmap 和 sendfile)。
示例:创建 SocketChannel
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false); // 设置为非阻塞模式
socketChannel.connect(new InetSocketAddress("example.com", 80));
(2) Buffer(缓冲区)
• ByteBuffer:最常用的缓冲区(支持堆内存和直接内存)。
• CharBuffer、IntBuffer:其他数据类型的缓冲区。
Buffer 的读写流程:
ByteBuffer buffer = ByteBuffer.allocate(1024); // 分配堆内存
// 写入数据
buffer.put("Hello".getBytes());
buffer
Java NIO 核心原理与应用详解

最低0.47元/天 解锁文章
565

被折叠的 条评论
为什么被折叠?



