简介
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 的工作原理可以概括为以下几个步骤:
- 打开一个通道。
- 创建一个缓冲区。
- 将数据读入或写出缓冲区。
- 使用选择器监视通道上的 I/O 事件。
- 当 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.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) { selector.select();
for (SelectionKey key : selector.selectedKeys()) { if (key.isAcceptable()) { SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.register(selector, SelectionKey.OP_READ); }
if (key.isReadable()) { ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = socketChannel.read(buffer);
socketChannel.register(selector, SelectionKey.OP_READ); } } } } }
|
这个示例代码创建了一个简单的 NIO 服务器,该服务器可以监听端口 8080 上的连接。当有新的连接请求到来时,服务器会接受连接并将其注册到选择器上。然后,服务器会使用选择器监视所有已连接的通道上的 I/O 事件。当有数据可读时,服务器会读取数据并进行处理。
总结
Java NIO 是一种强大的 I/O API,它可以用于开发高性能、高并发的网络应用。