Rumah  >  Artikel  >  Java  >  Bagaimanakah API NIO dalam aliran Java I/O berfungsi?

Bagaimanakah API NIO dalam aliran Java I/O berfungsi?

PHPz
PHPzasal
2024-04-13 21:36:01580semak imbas

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.

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

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:

  • Penimbal (Penimbal): Kawasan memori yang digunakan untuk memindahkan data antara aplikasi dan sistem pengendalian asas.
  • 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.

Cara NIO berfungsi

Pengendalian NIO adalah berdasarkan gelung acara:

  1. Buat penimbal dan saluran, mulakan pemilih.
  2. Daftar acara menarik pada pemilih (cth. boleh dibaca atau boleh ditulis).
  3. Pemilih meninjau saluran berdaftar untuk menentukan saluran yang sedia untuk mengendalikan data.
  4. Pemilih membangunkan urutan aplikasi apabila satu atau lebih saluran sedia.
  5. Aplikasi membaca atau menulis data dan kemudian membatalkan pendaftaran saluran pada pemilih.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn