Java 中 IO 流分为几种?BIO,NIO,AIO 有什么区别?
Java IO流按不同维度分为字节流/字符流、输入流/输出流、节点流/处理流。而BIO、NIO、AIO是Java中处理I/O的三种模型,它们分别适用于不同的场景。随着高并发网络应用的发展,NIO和AIO的使用越来越广泛,尤其是在需要处理大量并发连接的服务器端编程中。
Java IO流主要可以从两个维度进行分类:
1. 按流向分:
-
输入流:从数据源(如文件、网络等)读取数据到程序。
-
输出流:从程序写出数据到目的地(如文件、网络等)。
2. 按处理数据单位分:
-
字节流:以字节(8位)为单位进行读写,可以处理所有类型的数据。
-
字节输入流:
InputStream为基类,常用子类有FileInputStream、BufferedInputStream等。 -
字节输出流:
OutputStream为基类,常用子类有FileOutputStream、BufferedOutputStream等。
-
-
字符流:以字符(16位)为单位进行读写,主要用于处理文本数据。
-
字符输入流:
Reader为基类,常用子类有FileReader、BufferedReader等。 -
字符输出流:
Writer为基类,常用子类有FileWriter、BufferedWriter等。
-
3. 按功能分:
-
节点流:直接从数据源或目的地读写数据,如
FileInputStream、FileReader。 -
处理流(包装流):对节点流进行包装,提供更强大的读写功能,如
BufferedInputStream、BufferedReader提供缓冲功能,InputStreamReader和OutputStreamWriter实现字节流与字符流的转换。
BIO、NIO、AIO的区别
BIO、NIO、AIO是Java中用于处理I/O操作的三种模型,它们在不同版本的Java中被引入。
1. BIO (Blocking I/O) 同步阻塞I/O
-
特点:在进行I/O操作时,线程会一直阻塞,直到读写完成。每个连接都需要一个独立的线程处理。
-
工作模式:服务器为每个客户端连接创建一个线程,线程在读取或写入数据时会被阻塞。
-
优缺点:
-
优点:编程简单,在连接数少的情况下性能不错。
-
缺点:每个连接都需要一个线程,线程开销大,不适合高并发场景。
-
-
应用场景:连接数较少且固定的架构。
2. NIO (Non-blocking I/O 或 New I/O) 同步非阻塞I/O
-
特点:线程在发起I/O操作后可以立即返回,不需要阻塞等待,通过选择器(Selector)机制实现一个线程处理多个通道(Channel)。
-
核心组件:
-
Channel:类似于流,但可以同时进行读写,支持非阻塞模式。
-
Buffer:数据缓冲区, Channel读写数据必须经过Buffer。
-
Selector:一个选择器可以监控多个Channel的事件(如连接就绪、读就绪、写就绪)。
-
-
工作模式:线程通过Selector轮询多个Channel,当某个Channel有事件就绪时,线程才进行I/O操作。
-
优缺点:
-
优点:一个线程可以处理多个连接,适合高并发场景。
-
缺点:编程模型复杂,需要理解Buffer、Channel、Selector等概念。
-
-
应用场景:连接数多且连接时间短的架构,如聊天服务器、网络游戏服务器等。
3. AIO (Asynchronous I/O) 异步非阻塞I/O
-
特点:应用程序发起I/O操作后立即返回,当I/O操作完成时,系统会回调通知应用程序。整个过程不会阻塞线程。
-
工作模式:基于事件和回调机制,由操作系统完成I/O操作后通知应用程序。
-
优缺点:
-
优点:不会阻塞线程,适合高并发且连接时间长的场景。
-
缺点:编程模型复杂,需要回调函数,目前应用不是很广泛。
-
-
应用场景:连接数多且连接时间长的架构,如相册服务器、文件服务器等。
三者的对比表格
| 特性 | BIO | NIO | AIO |
|---|---|---|---|
| 阻塞方式 | 阻塞 | 非阻塞 | 非阻塞 |
| 同步/异步 | 同步 | 同步 | 异步 |
| 编程难度 | 简单 | 复杂 | 复杂 |
| 可靠性 | 高 | 高 | 高 |
| 吞吐量 | 低 | 高 | 高 |
| 适用场景 | 连接数少,低并发 | 连接数多,短连接 | 连接数多,长连接 |
补充说明:
-
同步与异步:指的是应用程序与内核的交互方式。同步是指应用程序主动等待I/O操作完成;异步是指应用程序发起I/O操作后继续执行,由内核通知应用程序I/O操作完成。
-
阻塞与非阻塞:指的是线程在等待I/O操作时的状态。阻塞是指线程一直等待直到I/O操作完成;非阻塞是指线程在等待I/O操作时可以执行其他任务。
总结
Java IO流按不同维度分为字节流/字符流、输入流/输出流、节点流/处理流。而BIO、NIO、AIO是Java中处理I/O的三种模型,它们分别适用于不同的场景。随着高并发网络应用的发展,NIO和AIO的使用越来越广泛,尤其是在需要处理大量并发连接的服务器端编程中。
更多推荐



所有评论(0)