JAVA IO和NIO的主要区别及使用说明

 更新时间:2025年09月21日 15:48:50   作者: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:双向数据传输通道(如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:高性能、非阻塞,适合高并发网络编程。
  • 选择依据:根据项目需求权衡开发效率和性能要求。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java下载https文件并上传阿里云oss服务器

    Java下载https文件并上传阿里云oss服务器

    这篇文章主要介绍了Java下载https文件并上传到阿里云oss服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 使用Java桥接模式打破继承束缚优雅实现多维度变化

    使用Java桥接模式打破继承束缚优雅实现多维度变化

    这篇文章主要为大家介绍了使用Java桥接模式打破继承束缚,优雅实现多维度变化,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • java.math包下计算浮点数和整数的类的实例

    java.math包下计算浮点数和整数的类的实例

    这篇文章主要介绍了java.math包下计算浮点数和整数的类的实例代码,本文通过使用BigDecimal进行浮点数比较给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • java中实现视频处理以及播放功能代码详解

    java中实现视频处理以及播放功能代码详解

    这篇文章主要给大家介绍了关于java中实现视频处理以及播放功能的相关资料,最近要实现一套音视频播放程序,所以这里给大家总结下,需要的朋友可以参考下
    2023-09-09
  • JAVA正则表达式匹配多个空格的解决方案

    JAVA正则表达式匹配多个空格的解决方案

    这篇文章主要介绍了JAVA正则表达式匹配多个空格的解决方案,文中提到了()和[]本质的区别,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • JAVA中对List进行查询

    JAVA中对List进行查询

    下面小编就为大家带来一篇在java List中进行模糊查询的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • MyBatis使用<foreach>标签like查询报错解决问题

    MyBatis使用<foreach>标签like查询报错解决问题

    这篇文章主要介绍了MyBatis使用<foreach>标签like查询报错解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Java httpClient连接池支持多线程高并发的实现

    Java httpClient连接池支持多线程高并发的实现

    本文主要介绍了Java httpClient连接池支持多线程高并发的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java多线程Callable接口实现代码示例

    Java多线程Callable接口实现代码示例

    相信大家对Java编程中如何创建线程已经不陌生了,这篇文章就向朋友们介绍实现callable接口,具体实例详见正文。
    2017-10-10
  • 详解java平台解析协议相关备忘

    详解java平台解析协议相关备忘

    这篇文章主要介绍了详解java平台解析协议相关备忘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01

最新评论