在 Java 的 I/O 模型中,BIO(Blocking I/O,阻塞式 I/O)是最基础也最经典的一种。它伴随着 Java 的诞生而出现,虽然在高并发场景下逐渐被 NIO 和 AIO 取代,但作为理解其他 I/O 模型的基础,其原理和机制仍具有重要的学习价值。
Java BIO 的核心特点是阻塞,即当一个 I/O 操作执行时,对应的线程会被阻塞,直到该操作完成才能继续执行其他任务。其工作原理可以概括为 “一个连接一个线程”,具体流程如下:
(1)建立连接阶段:服务器端通过ServerSocket监听指定端口,当客户端通过Socket发起连接请求时,服务器端会调用accept()方法接受连接。在这个过程中,accept()方法是阻塞的,也就是说,在没有客户端连接时,服务器端的线程会一直停留在accept()方法处等待。
(2)数据传输阶段:连接建立后,服务器端和客户端之间通过输入流和输出流进行数据传输。此时,无论是调用输入流的read()方法读取数据,还是调用输出流的write()方法写入数据,线程都会被阻塞。例如,当read()方法被调用时,如果此时没有数据可读,线程会一直阻塞,直到有数据到来或者连接关闭。
(3)线程模型:在 BIO 模型中,每一个客户端连接都需要一个独立的线程来处理。服务器端会为每个新接入的客户端创建一个线程,该线程负责处理与该客户端的所有 I/O 操作。当客户端的 I/O 操作完成(如数据传输结束、连接关闭)后,该线程才会被释放。
BIO作为一款老I/O模型,其也有不少优点,例如
(1)实现简单易懂:BIO 的编程模型非常直观,API 使用简单,开发者不需要关注复杂的底层机制,容易上手和理解。对于一些简单的网络应用或本地文件操作,使用 BIO 可以快速开发出功能。
(2)适合简单场景:在并发量小、连接数少的场景下,BIO 能够稳定