学习日报 20250921|NIO
1. 什么是 NIO?
NIO = New Input/Output,是 Java 在 JDK 1.4 引入的一套新的 I/O API。
和传统的 BIO(Blocking I/O,阻塞IO) 相比,NIO 有三个核心特点:
非阻塞 I/O
传统 BIO:一个线程读写一个连接,容易造成线程浪费。
NIO:一个线程可以管理多个通道(Channel),适合高并发场景。
基于缓冲区 Buffer
BIO:数据直接读到流里。
NIO:数据先读到 Buffer,再由程序处理。
基于 Channel + Selector
Channel:类似“通道”,可以同时读写。
Selector:选择器,可以监控多个通道(连接)的事件(如读、写、连接等)。
2. NIO 的核心组件
Channel(通道):比如
FileChannel
、SocketChannel
。Buffer(缓冲区):存储数据,比如
ByteBuffer
。Selector(选择器):实现多路复用,一个线程监听多个通道。
3. Demo 示例(NIO 服务端与客户端)
📌 服务端:NIO 实现一个简单 Echo Server
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;public class NioServer {public static void main(String[] args) throws IOException {// 1. 打开服务器通道ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.bind(new InetSocketAddress(8080));serverChannel.configureBlocking(false); // 非阻塞// 2. 打开 SelectorSelector selector = Selector.open();serverChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("NIO Server started on port 8080...");while (true) {selector.select(); // 阻塞直到有事件发生Iterator<SelectionKey> it = selector.selectedKeys().iterator();while (it.hasNext()) {SelectionKey key = it.next();it.remove();if (key.isAcceptable()) {SocketChannel client = serverChannel.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);System.out.println("Client connected: " + client.getRemoteAddress());} else if (key.isReadable()) {SocketChannel client = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(256);int read = client.read(buffer);if (read == -1) {client.close();} else {buffer.flip();client.write(buffer); // 回显数据buffer.clear();}}}}}
}
📌 客户端:NIO 简单连接并发送消息
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;public class NioClient {public static void main(String[] args) throws Exception {SocketChannel client = SocketChannel.open(new InetSocketAddress("localhost", 8080));String message = "Hello NIO!";ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());client.write(buffer);buffer.clear();client.read(buffer);buffer.flip();System.out.println("Server echoed: " + new String(buffer.array(), 0, buffer.limit()));client.close();}
}
4. 运行效果
启动服务端 →
NIO Server started on port 8080...
启动客户端 → 控制台输出:
Server echoed: Hello NIO!
服务端控制台会显示客户端连接,并回显消息。
✅ 总结一句话:
NIO 就是 Java 的新 I/O 模型,基于 Channel + Buffer + Selector,支持 多路复用 + 非阻塞通信,特别适合高并发的网络程序,比如 Netty 框架就是基于 NIO。