Java NIO API ialah API termaju untuk mengendalikan operasi I/O, yang memberikan prestasi dan kebolehskalaan yang lebih baik daripada penyekatan tradisional I/O: Penampan: dipindahkan antara aplikasi dan sistem pengendalian Kawasan memori untuk data. Saluran: Konsep abstrak yang mewakili sambungan antara aplikasi dan peranti I/O. Pemilih: Digunakan untuk meninjau berbilang saluran untuk menentukan saluran yang sedia untuk dibaca dan ditulis.
NIO API dalam Java I/O Streaming: Analisis Yang Teliti
Pengenalan
NIO (Non-Blocking I/O) API ialah API/O tahap yang lebih tinggi dalam operasi Java untuk pengendalian I. Ia memberikan prestasi dan kebolehskalaan yang lebih baik daripada penyekatan tradisional I/O, terutamanya apabila mengendalikan sejumlah besar sambungan atau data.
Komponen API NIO
NIO API terdiri daripada komponen utama berikut:
Cara NIO berfungsi
Pengendalian NIO adalah berdasarkan gelung acara:
Kes praktikal
Berikut ialah contoh menulis pelayan mudah menggunakan API NIO:
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(); } } }
Dalam contoh ini, pelayan mendengar port 8080 dan menerima sambungan pelanggan. Apabila pelanggan menyambung, ia ditambahkan pada senarai soket yang disambungkan. Pelayan menggunakan pemilih untuk meninjau soket yang disambungkan untuk menentukan soket yang sedia untuk membaca dan menulis data.
Atas ialah kandungan terperinci Bagaimanakah API NIO dalam aliran Java I/O berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!