JAVA IO和NIO的主要区别及使用说明
作者:night_gu
Java IO(BIO)阻塞式,逐字节流处理;NIO非阻塞,基于缓冲区和通道实现多路复用,单线程管理多连接,适合高并发网络编程,IO代码简单但性能低,NIO性能高但复杂度增加,选择需权衡开发效率与性能需求
JAVA IO和NIO的主要区别
IO(BIO)是阻塞的,NIO是非阻塞的
传统IO在读写数据时会阻塞线程,直到数据准备好或完全写入。
例如,InputStream.read()
会一直阻塞,直到有数据可读。NIO通过通道(Channel)和选择器(Selector)实现非阻塞模式,线程可以处理其他任务,无需等待数据就绪。
IO面向流,NIO面向缓冲区
IO基于流(Stream)模型,数据只能单向流动(输入流或输出流)。NIO基于缓冲区(Buffer)和通道,数据先读写到缓冲区,再通过通道双向传输,支持更灵活的数据处理。
NIO支持多路复用
NIO通过Selector
监控多个通道的事件(如连接、读写),单线程即可管理多个连接,适合高并发场景。传统IO每个连接需独立线程处理,资源消耗大。
核心组件对比
IO的核心类
InputStream
/OutputStream
:字节流基类。Reader
/Writer
:字符流基类。
NIO的核心类
Buffer
:数据存储容器(如ByteBuffer
)。Channel
:双向数据传输通道(如FileChannel
、SocketChannel
)。Selector
:监听多个通道的事件。
性能与应用场景
IO适用场景
- 连接数少、数据量大的场景(如文件读写)。
- 代码简单,无需复杂并发控制。
NIO适用场景
- 高并发、低延迟的网络应用(如聊天.服务器)。
- 需要同时管理大量连接(如Web服务器)。
代码示例对比
传统IO读取文件
try (FileInputStream fis = new FileInputStream("file.txt")) { int data; while ((data = fis.read()) != -1) { System.out.print((char) data); } }
NIO读取文件
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(); } }
总结
- IO:简单易用,适合同步阻塞操作。
- NIO:高性能、非阻塞,适合高并发网络编程。
- 选择依据:根据项目需求权衡开发效率和性能要求。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。