Java NIO

简介

Java NIO(New I/O)是 Java 1.4 中引入的一套新的 I/O API,它与传统的 Java I/O 模型相比具有以下优势:

  • 非阻塞 I/O:NIO 的 I/O 操作是非阻塞的,这意味着线程不会在 I/O 操作期间阻塞。这使得 NIO 非常适合高并发应用。
  • I/O 多路复用:NIO 支持 I/O 多路复用,这意味着一个线程可以同时处理多个 I/O 操作。这使得 NIO 能够有效地利用系统资源。
  • 面向缓冲区的 I/O:NIO 的 I/O 操作是面向缓冲区的,这意味着数据在读写操作之前会被缓存到缓冲区中。这使得 NIO 能够提高 I/O 操作的效率。

NIO 的核心组件

NIO 由以下三个核心组件组成:

  • 通道(Channel):通道是 NIO 中 I/O 操作的基本单位。它表示一个连接到 I/O 源或目标的通信路径。
  • 缓冲区(Buffer):缓冲区是用于存储 I/O 操作数据的内存区域。
  • 选择器(Selector):选择器用于监视多个通道上的 I/O 事件。

NIO 的工作原理

NIO 的工作原理可以概括为以下几个步骤:

  1. 打开一个通道。
  2. 创建一个缓冲区。
  3. 将数据读入或写出缓冲区。
  4. 使用选择器监视通道上的 I/O 事件。
  5. 当 I/O 事件发生时,处理该事件。

NIO 的代码示例

以下是一个简单的 NIO 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class NioServer {

public static void main(String[] args) throws IOException {
// 打开一个ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

// 绑定端口
serverSocketChannel.bind(new InetSocketAddress(8080));

// 设置为非阻塞模式
serverSocketChannel.configureBlocking(false);

// 创建一个选择器
Selector selector = Selector.open();

// 将ServerSocketChannel注册到选择器上,并监听ACCEPT事件
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
// 阻塞等待事件发生
selector.select();

// 遍历所有发生的事件
for (SelectionKey key : selector.selectedKeys()) {
// 处理ACCEPT事件
if (key.isAcceptable()) {
// 接受连接
SocketChannel socketChannel = serverSocketChannel.accept();

// 将SocketChannel注册到选择器上,并监听READ事件
socketChannel.register(selector, SelectionKey.OP_READ);
}

// 处理READ事件
if (key.isReadable()) {
// 读取数据
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = socketChannel.read(buffer);

// 处理数据
// ...

// 将SocketChannel注册到选择器上,并监听READ事件
socketChannel.register(selector, SelectionKey.OP_READ);
}
}
}
}
}

这个示例代码创建了一个简单的 NIO 服务器,该服务器可以监听端口 8080 上的连接。当有新的连接请求到来时,服务器会接受连接并将其注册到选择器上。然后,服务器会使用选择器监视所有已连接的通道上的 I/O 事件。当有数据可读时,服务器会读取数据并进行处理。

总结

Java NIO 是一种强大的 I/O API,它可以用于开发高性能、高并发的网络应用。