ホームページ  >  記事  >  Java  >  Java I/O ストリームの NIO API はどのように機能しますか?

Java I/O ストリームの NIO API はどのように機能しますか?

PHPz
PHPzオリジナル
2024-04-13 21:36:01578ブラウズ

Java NIO API は、I/O 操作を処理するための高度な API であり、従来のブロッキング I/O よりも優れたパフォーマンスとスケーラビリティを提供します。 バッファ: アプリケーションとオペレーティング システムの間でデータを転送するためのメモリ領域。チャネル: アプリケーションと I/O デバイス間の接続を表す抽象的な概念。セレクター: 複数のチャネルをポーリングして、どのチャネルが読み取りおよび書き込みの準備ができているかを判断するために使用されます。

Java I/O流中的NIO API是如何工作的?

#Java I/O ストリームの NIO API: 徹底した分析

はじめに

NIO (ノンブロッキング I/O) API は、I/O 操作を処理するための Java の高レベル API です。特に大量の接続やデータを処理する場合に、従来のブロッキング I/O よりも優れたパフォーマンスとスケーラビリティを提供します。

NIO API のコンポーネント

NIO API は次の主要コンポーネントで構成されます:

  • バッファ:A メモリアプリケーションと基盤となるオペレーティング システムの間でデータを転送するために使用される領域。
  • チャネル: アプリケーションと I/O デバイス間の接続を表す抽象的な概念。
  • セレクター: 複数のチャネルをポーリングして、どのチャネルが読み取りおよび書き込みの準備ができているかを判断するために使用されます。

NIO の仕組み

NIO の操作はイベント ループに基づいています:

    バッファとチャネルの作成、初期化選択デバイス。
  1. 関心のあるイベントをセレクターに登録します (読み取り可能または書き込み可能など)。
  2. セレクターは登録されたチャンネルをポーリングして、どのチャンネルがデータを処理する準備ができているかを判断します。
  3. セレクターは、1 つ以上のチャネルの準備ができたときにアプリケーション スレッドを起動します。
  4. アプリケーションはデータの読み取りまたは書き込みを行った後、セレクター上のチャネルの登録を解除します。

実際的なケース

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。