Skip to content

IO

java中的IO模型

Java中的IO(输入/输出)模型主要包括两大类:阻塞IO(BIO)和非阻塞IO(NIO)。 随着Java的发展,这两种模型已经被扩展和增强,特别是非阻塞IO,它发展出了NIO(New IO)、NIO.2(也称为AIO,异步IO)等。下面是对这些模型的简要介绍:

1. BIO - 阻塞IO

  • BIO是Java早期模型,以流(Stream)的方式处理数据,其中数据读取或写入的每个操作都是阻塞的。例如,如果一个线程从网络中读取数据,它会一直等待直到数据到达。
  • BIO适合连接数较少且固定的应用架构,但在高并发环境下性能不佳,因为每个连接都需要独立的线程来处理。

2. NIO - 非阻塞IO

  • NIO引入了通道(Channel)、缓冲区(Buffer)和选择器(Selector)的概念,支持非阻塞的数据读写操作和多路复用技术。
  • NIO可以让一个线程管理多个输入和输出通道通过单个线程轮询访问所管理的所有通道,检查哪些通道准备好了可以进行数据的读写,从而提高系统资源的利用率和吞吐量。
  • NIO广泛用于网络服务器开发中,特别是需要处理成千上万个客户端连接的场景。

3. NIO.2 / AIO - 异步IO

  • 在Java 7中引入,NIO.2增加了对异步文件IO和网络IO的支持,即AIO。
  • AIO实现了真正的异步非阻塞IO操作。在AIO模型中,IO操作会立即返回,不会阻塞线程,而是在IO操作完成时通过回调函数通知应用程序。
  • AIO适用于连接数多,但单个连接数据交互不是很频繁,处理大量并发连接但每个连接IO操作不是特别密集的应用场景。

模型选择

  • BIO:适合连接数目比较小且固定的应用,例如传统的客户端-服务器应用。
  • NIO:适合需要使用非阻塞方式处理成千上万个连接的场景,比如高性能服务器。
  • AIO:适合IO操作非常耗时的应用,可以显著减少线程资源的占用。

多路复用IO

通过一个选择器来监听多个通道的状态变化,从而实现单线程管理多个通道的能力,可以在不阻塞的情况下监控多个网络连接,一旦某个连接有数据可读或可写, 选择器就会通知应用程序进行处理。这种方式大大提高了系统的并发处理能力。