一、核心概念
1. Java IO(传统IO)
面向流(Stream-Oriented):以字节或字符流的形式逐字节处理数据。
阻塞式(Blocking):线程在读写操作完成前会被阻塞,无法执行其他任务。
适用场景:简单的文件操作或低并发网络通信。
2. Java NIO(New IO)
面向缓冲区(Buffer-Oriented):数据先读入缓冲区,再通过通道(Channel)批量处理。
非阻塞式(Non-Blocking):线程可注册多个通道到选择器(Selector),轮询就绪事件。
适用场景:高并发网络服务(如聊天服务器、文件传输)。
二、核心差异对比
特性 | Java IO | Java NIO |
---|---|---|
数据模型 | 基于流(Stream) | 基于通道(Channel)和缓冲区(Buffer) |
阻塞模式 | 阻塞式 | 非阻塞式(支持阻塞模式) |
线程模型 | 一连接一线程(资源消耗高) | 单线程管理多连接(Selector 多路复用) |
数据传输效率 | 适合小数据量 | 适合大数据量和高并发 |
API 复杂度 | 简单易用 | 复杂,需管理缓冲区、选择器 |
三、核心组件详解
1. Java IO 的核心类
字节流:
InputStream
、OutputStream
(如FileInputStream
)。字符流:
Reader
、Writer
(如BufferedReader
)。典型代码:
try (FileInputStream fis = new FileInputStream("file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } }
2. Java NIO 的核心类
通道(Channel):连接数据源与缓冲区的双向管道(如
FileChannel
、SocketChannel
)。缓冲区(Buffer):存储数据的容器(如
ByteBuffer
)。选择器(Selector):监听多个通道的就绪事件(如读、写、连接)。
典型代码:
// 使用 Channel 和 Buffer 读取文件 try (FileChannel channel = FileChannel.open(Paths.get("file.txt"))) { ByteBuffer buffer = ByteBuffer.allocate(1024); while (channel.read(buffer) != -1) { buffer.flip(); // 切换为读模式 while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } buffer.clear(); // 清空缓冲区,准备下次写入 } }
四、工作机制对比
1. 阻塞式 IO 模型
单线程处理流程:
读取数据 -> 处理数据 -> 写入数据(阻塞直到完成)
缺点:每个连接需独立线程,资源消耗大,不适合高并发。
2. 非阻塞式 NIO 模型
多路复用流程:
注册通道到 Selector -> 轮询就绪事件 -> 处理就绪通道
优势:单线程管理数千连接,高效利用资源。
五、性能与应用场景
1. IO 的适用场景
文件读写(如日志处理)。
低并发网络请求(如单用户客户端工具)。
2. NIO 的适用场景
高并发服务器(如 WebSocket 服务器、即时通讯)。
大文件传输(零拷贝技术优化性能)。
需要非阻塞或异步处理的场景。
六、NIO 的扩展:NIO.2(AIO)
Java 7 引入的 异步通道(AsynchronousChannel) 进一步扩展了 NIO:
异步非阻塞:通过回调(Callback)或 Future 处理完成事件。
典型类:
AsynchronousFileChannel
、AsynchronousSocketChannel
。
七、总结
维度 | IO | NIO |
---|---|---|
设计目标 | 简化基础操作 | 支持高并发和非阻塞处理 |
资源开销 | 高(每连接一线程) | 低(单线程多连接) |
学习曲线 | 简单 | 复杂 |
适用领域 | 传统文件操作、低并发网络 | 高并发网络服务、大数据传输 |
选择建议
传统 IO:优先用于简单的文件操作或低并发场景。
NIO:用于高并发网络服务或需要非阻塞处理的场景。
NIO.2(AIO):需要异步处理时选择(如大文件异步读写)。
通过理解 IO 与 NIO 的核心差异,开发者可以更高效地选择适合的工具,构建高性能的 Java 应用。