Java NIO API是一種用於處理I/O操作的先進API,它提供比傳統阻塞I/O更好的效能和可擴展性:緩衝區(Buffers):在應用程式和作業系統之間傳輸資料的記憶體區域。通道(Channels):抽象概念,表示應用程式和I/O裝置之間的連接。選擇器(Selectors):用於輪詢多個通道,以確定哪些通道已準備好讀寫。
Java I/O流中的NIO API:徹底解析
簡介
NIO(非阻塞I/O)API是Java中用來處理I/O作業的更高等級API。它提供了比傳統的阻塞I/O更好的效能和可擴展性,特別是在處理大量連接或資料時。
NIO API的組成部分
NIO API由以下主要元件組成:
NIO的工作原理
NIO的操作是基於事件循環:
實戰案例
以下是使用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(); } } }
在這個範例中,伺服器監聽8080端口,並接受客戶端連接。當一個客戶端連接後,它將被添加到已連接套接字清單中。伺服器使用選擇器輪詢已連接的套接字,以決定哪些套接字已準備好讀寫資料。
以上是Java I/O流中的NIO API是如何運作的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!