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:双向数据传输通道(如FileChannelSocketChannel)。
  • 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:高性能、非阻塞,适合高并发网络编程。
  • 选择依据:根据项目需求权衡开发效率和性能要求。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐