Java NIO(非阻塞I/O)简介及使用方法

Java NIO
Java NIO是Java 1.4中引入的一种新的I/O模型,它提供了非阻塞I/O操作,使得Java应用程序能够同时处理多个网络连接,NIO的核心组件包括缓冲区(Buffer)、通道(Channel)和选择器(Selector),与传统的Java I/O相比,NIO在性能和功能上都有很大的提升。
缓冲区(Buffer)
缓冲区是NIO中的核心组件之一,它用于存储数据,在Java NIO中,缓冲区分为直接缓冲区和非直接缓冲区,直接缓冲区是直接在操作系统的内存中分配的,可以减少数据在用户态和内核态之间的复制次数,提高性能。
创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024); // 分配一个大小为1024的缓冲区
缓冲区操作

- 写入数据
buffer.put('H');
buffer.put('e');
buffer.put('l');
buffer.put('l');
buffer.put('o');
- 翻转缓冲区
buffer.flip();
- 读取数据
char c = (char) buffer.get();
- 清除缓冲区
buffer.clear();
通道(Channel)
通道是连接I/O源和目标(如文件、网络连接等)的通道,Java NIO提供了多种通道类型,如文件通道(FileChannel)、Socket通道(SocketChannel)等。
创建通道
FileChannel fileChannel = new FileOutputStream("example.txt").getChannel();
通道操作
- 读取数据
ByteBuffer buffer = ByteBuffer.allocate(1024); fileChannel.read(buffer);
- 写入数据
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello, NIO!");
fileChannel.write(buffer);
选择器(Selector)
选择器是Java NIO中用于同时监听多个通道的事件的工具,通过选择器,我们可以注册通道,并监听通道上发生的事件,如连接就绪、数据可读、数据可写等。

创建选择器
Selector selector = Selector.open();
注册通道到选择器
SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ);
轮询选择器
while (true) {
selector.select(); // 阻塞,直到至少有一个通道在你注册的事件上就绪了
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = keys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isReadable()) {
// 处理读事件
}
if (key.isWritable()) {
// 处理写事件
}
keyIterator.remove();
}
}
Java NIO提供了非阻塞I/O操作,使得Java应用程序能够同时处理多个网络连接,通过使用缓冲区、通道和选择器,我们可以高效地处理I/O操作,在实际开发中,根据需求选择合适的NIO组件,可以提升应用程序的性能。















