ホームページ >Java >&#&チュートリアル >Java I/O ストリームの NIO API はどのように機能しますか?
Java NIO API は、I/O 操作を処理するための高度な API であり、従来のブロッキング I/O よりも優れたパフォーマンスとスケーラビリティを提供します。 バッファ: アプリケーションとオペレーティング システムの間でデータを転送するためのメモリ領域。チャネル: アプリケーションと I/O デバイス間の接続を表す抽象的な概念。セレクター: 複数のチャネルをポーリングして、どのチャネルが読み取りおよび書き込みの準備ができているかを判断するために使用されます。
#Java I/O ストリームの NIO API: 徹底した分析
はじめに
NIO (ノンブロッキング I/O) API は、I/O 操作を処理するための Java の高レベル 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 中国語 Web サイトの他の関連記事を参照してください。