Java 的 IO 流和 BIO、NIO、AIO 是有关系的,但它们分别属于不同的层次和抽象级别。

IO 流是 Java 提供的一组用于执行输入/输出操作的类和接口,它们主要位于 java.io 包中。IO 流提供了对各种输入/输出设备(如文件、管道、网络等)进行读写操作的统一方式,隐藏了底层不同设备之间的差异。常见的 IO 流类有 FileInputStreamFileOutputStreamBufferedReaderBufferedWriter 等。

而 BIO、NIO 和 AIO 则是 Java 对底层操作系统提供的 I/O 模型的不同抽象和封装,它们体现了在不同场景下对 I/O 操作的不同处理方式。具体来说:

  1. BIO (Blocking I/O) 是基于传统的同步阻塞 I/O 模型,它在进行 I/O 操作时会导致线程阻塞,直到操作完成。Java 中的 IO 流最初就是基于 BIO 实现的,例如 FileInputStreamSocket 的输入/输出操作都是阻塞式的。

  2. NIO (Non-Blocking I/O) 则是基于同步非阻塞 I/O 模型,它引入了选择器(Selector)、通道(Channel)等概念,可以通过一个线程处理多个连接,提高了系统的吞吐量。Java 在 1.4 版本中引入了 NIO,提供了 java.nio 包,其中包含了 BufferSelectorChannel 等核心组件。

  3. AIO (Asynchronous I/O) 是基于异步非阻塞 I/O 模型,它在进行 I/O 操作时不会导致线程阻塞,而是通过操作系统内核直接读写数据,并通过回调通知应用程序 I/O 操作已完成。Java 在 1.7 版本中引入了 AIO,提供了 java.nio.channels 包中的 AsynchronousChannel 等相关类。

因此,IO 流提供了对各种输入/输出设备进行读写操作的统一方式,而 BIO、NIO 和 AIO 则是底层 I/O 模型的不同实现方式,它们可以支持 IO 流对不同设备进行读写操作。

实际上,在使用 Java IO 流时,底层可能会根据不同的场景自动选择 BIO、NIO 或 AIO 模型。例如,对于文件操作,Java 可能会使用 BIO 或 NIO 模型;而对于网络操作,Java 可能会根据连接数和吞吐量要求,选择使用 BIO、NIO 或 AIO 模型。

总的来说,IO 流提供了一种设备无关的统一抽象,而 BIO、NIO 和 AIO 则是底层 I/O 模型的不同实现方式,它们共同构成了 Java 中完整的 I/O 框架。

BIO、NIO 和 AIO 是 Java 中不同的 I/O 模型,它们在处理 I/O 操作时的方式和效率有所不同。下面是它们的区别以及相应的代码示例:

1. BIO (Blocking I/O):

  • BIO 是传统的同步阻塞 I/O 模型,它在进行 I/O 操作时会导致线程阻塞,直到操作完成。
  • 它适用于连接数较少且固定的情况,但在并发连接数较多时,线程资源容易被耗尽。

示例代码:

ServerSocket serverSocket = new ServerSocket(8000);
while (true) {
    Socket socket = serverSocket.accept(); // 阻塞直到有新的连接
    InputStream in = socket.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf); // 阻塞直到有数据可读
    // 处理数据...
}

2. NIO (Non-blocking I/O):

  • NIO 是一种同步非阻塞 I/O 模型,它引入了选择器(Selector)和通道(Channel)的概念,可以通过一个线程处理多个连接。
  • NIO 在进行 I/O 操作时不会导致线程阻塞,而是通过选择器监听多个通道上的事件,从而提高了系统的吞吐量。
  • 相比 BIO,NIO 更加复杂,需要更多的编码工作。

示例代码:

ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(8000));
serverChannel.configureBlocking(false);
Selector selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
    selector.select(); // 阻塞直到有事件准备就绪
    Set<SelectionKey> keys = selector.selectedKeys();
    for (SelectionKey key : keys) {
        if (key.isAcceptable()) {
            SocketChannel client = serverChannel.accept();
            client.configureBlocking(false);
            client.register(selector, SelectionKey.OP_READ);
        } else if (key.isReadable()) {
            SocketChannel client = (SocketChannel) key.channel();
            ByteBuffer buf = ByteBuffer.allocate(1024);
            int len = client.read(buf);
            if (len > 0) {
                // 处理数据...
            }
        }
    }
    keys.clear();
}

3. AIO (Asynchronous I/O):

  • AIO 是一种异步非阻塞 I/O 模型,它引入了异步通道(AsynchronousChannelProvider)和异步文件通道(AsynchronousFileChannel)的概念。
  • AIO 在进行 I/O 操作时不会导致线程阻塞,而是通过操作系统内核直接读写数据,并通过回调通知应用程序I/O操作已完成。
  • AIO 比 NIO 更加复杂,但在处理大量并发连接时具有更好的性能和更高的吞吐量。

示例代码:

AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8000));

serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
    @Override
    public void completed(AsynchronousSocketChannel client, Void attachment) {
        serverChannel.accept(null, this); // 接受下一个连接
        ByteBuffer buf = ByteBuffer.allocate(1024);
        client.read(buf, null, new CompletionHandler<Integer, Object>() {
            @Override
            public void completed(Integer result, Object attachment) {
                buf.flip();
                // 处理数据...
            }

            @Override
            public void failed(Throwable exc, Object attachment) {
                // 处理异常
            }
        });
    }

    @Override
    public void failed(Throwable exc, Void attachment) {
        // 处理异常
    }
});

// 其他业务逻辑...

总结:

  • BIO 是同步阻塞模型,适用于连接数较少的场景,但并发性能较差。
  • NIO 是同步非阻塞模型,通过选择器和通道实现单线程处理多个连接,提高了系统的吞吐量。
  • AIO 是异步非阻塞模型,通过操作系统内核直接读写数据,并通过回调通知应用程序,性能最佳,但编码复杂性较高。

在选择 I/O 模型时,需要权衡连接数、吞吐量和编码复杂性等因素。一般情况下,如果连接数较少且固定,可以使用 BIO;如果连接数较多且需要高吞吐量,可以考虑使用 NIO;如果需要处理大量并发连接,可以考虑使用 AIO。

刚学java菜鸡,永劫无间蚀月,王者荣耀王者,金铲铲小铂金,第五人格菜鸡,原神开服玩家,星穹铁道菜鸡,崩坏的菜鸡,闪耀暖暖,和平精英,LOL,CSGO,以及三A大作收集者等等。。。