📜  Java NIO-频道(1)

📅  最后修改于: 2023-12-03 15:15:57.346000             🧑  作者: Mango

Java NIO-频道

Java NIO(New IO)是Java SDK 1.4引入的新的IO API。它提供了更快速、更多样化和更可伸缩的输入/输出操作,取代了原始IO API的一部分功能。

特点

Java NIO的特点包括:

  • 通道和缓冲区:Java NIO中的IO是基于通道和缓冲区的。
  • 非阻塞IO:Java NIO提供了非阻塞IO功能,这意味着一个线程可以处理多个通道。
  • 选择器:Java NIO提供了选择器,使一个线程可以同时监视多个通道的输入。
  • 处理以块为单位的数据。
实现

Java NIO主要由以下几个组件组成:

  • 通道(Channel):类似于流,但是可以读写,而且支持非阻塞IO。
  • 缓冲区(Buffer):底层是一个数组,用于读写数据。
  • 选择器(Selector):多路复用的对象,用于监控多个通道的IO状态。
  • 选择键(SelectionKey):表示的是一对通道和选择器的绑定。
应用场景

Java NIO适合于需要处理大量连接的网络应用,如聊天服务器、游戏服务器、流媒体服务器等等。Java NIO也可以用于文件IO。

示例代码
// 使用Java NIO实现HTTPServer
public class HttpServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.socket().bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            int readyChannels = selector.select();
            if (readyChannels == 0) {
                continue;
            }

            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();

                if (key.isAcceptable()) {
                    SocketChannel clientChannel = serverSocketChannel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    SocketChannel clientChannel = (SocketChannel) key.channel();
                    ByteBuffer buf = ByteBuffer.allocate(1024);
                    clientChannel.read(buf);
                    buf.flip();
                    String request = new String(buf.array()).trim();

                    String response = "HTTP/1.1 200 OK\n" +
                            "Content-Type: text/html; charset=UTF-8\n\n" +
                            "<html><body>Hello World!</body></html>";

                    clientChannel.write(ByteBuffer.wrap(response.getBytes()));
                    clientChannel.close();
                }

                keyIterator.remove();
            }
        }
    }
}

以上示例代码实现了一个简单的HTTP服务器,使用Java NIO实现。在循环中,程序等待事件(使用选择器),当有事件时分发线程来处理。处理代码不同于常规的Socket IO,需要更多的代码,如显示地获取和释放缓冲区并确定定义好使用缓冲区的方式。