Java NIO API is an advanced API for handling I/O operations, which provides better performance and scalability than traditional blocking I/O: Buffers: Between the application and the operating system A memory area for transferring data between. Channels: Abstract concept that represents the connection between an application and an I/O device. Selectors: Used to poll multiple channels to determine which channels are ready for reading and writing.
NIO API in Java I/O Streams: A Thorough Analysis
Introduction
NIO (Non-blocking I/O) API is a higher-level API in Java for handling I/O operations. It provides better performance and scalability than traditional blocking I/O, especially when handling large amounts of connections or data.
Components of NIO API
NIO API consists of the following main components:
How NIO works
The operation of NIO is based on an event loop:
Practical case
The following is an example of writing a simple server using the NIO API:
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.ArrayList; import java.util.List; public class NIOServer { private static final int PORT = 8080; private static List<SocketChannel> connectedSockets = new ArrayList<>(); public static void main(String[] args) throws IOException { // 创建服务器套接字通道 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 将服务器通道绑定到端口 serverSocketChannel.bind(new InetSocketAddress(PORT)); // 设置非阻塞模式 serverSocketChannel.configureBlocking(false); // 获取选择器 Selector selector = Selector.open(); // 将服务器通道注册到选择器,感兴趣的可接受事件 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 事件循环 while (true) { // 阻塞,直到至少有一个通道准备好 int readyChannels = selector.select(); // 如果没有准备好的通道,则继续 if (readyChannels == 0) { continue; } // 处理准备好的通道 for (SelectionKey key : selector.selectedKeys()) { // 可接受事件 if (key.isAcceptable()) { // 接受传入的连接 SocketChannel socketChannel = serverSocketChannel.accept(); // 设置非阻塞模式 socketChannel.configureBlocking(false); // 将套接字通道注册到选择器,感兴趣的可读事件 socketChannel.register(selector, SelectionKey.OP_READ); // 添加到已连接套接字列表 connectedSockets.add(socketChannel); } // 可读事件 else if (key.isReadable()) { SocketChannel socketChannel = (SocketChannel) key.channel(); // 读取数据 ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = socketChannel.read(buffer); // 如果读取到EOF,则关闭套接字 if (bytesRead == -1) { socketChannel.close(); connectedSockets.remove(socketChannel); } // 处理读取到的数据 // ... } } // 清除已处理的键 selector.selectedKeys().clear(); } } }
In this example, the server listens on 8080 port and accept client connections. When a client connects, it is added to a list of connected sockets. The server uses selectors to poll connected sockets to determine which sockets are ready to read and write data.
The above is the detailed content of How does the NIO API in Java I/O streams work?. For more information, please follow other related articles on the PHP Chinese website!