详细介绍:Java 中 NIO 和IO 的区别

news/2026/1/17 22:51:43/文章来源:https://www.cnblogs.com/tlnshuju/p/19497331

详细介绍:Java 中 NIO 和IO 的区别

2026-01-17 22:48  tlnshuju  阅读(0)  评论(0)    收藏  举报

在Java 中,IO(input/output)和 NIO(new Input/output) 是两种不同的输入输出处理机制。它们各自有不同的设计理念和使用场景,理解这两者的区别对于优化性能、提高应用的响应速度非常重要。

一、IO(传统输入输出)

IO是java最早的输入输出方式,通过流(Stream)来读写数据。主要包括字节流和字符流。通过阻塞式的操作来实现数据的读写。
1、特点
阻塞式(Blocking):每次调用读写操作时,线程会被阻塞,直到数据完全读取或写入。也就是说,io操作会让线程一直等待,知道数据准备好。

同步:每个线程只能处理一个连接,不能同时处理多个客户端请求。需要多个线程来同时处理多个IO操作。

易于使用:传统IO库简单直观适合小型应用或数据量较小的场景。

数据流模型:基于流模型,数据按顺序从源流传输到目标流。

2、主要类

  • inputStream 和 outputStream字节流
  • reader 和 writer:字符流

3、示例:

// 读取文件内容
FileInputStream fis = new FileInputStream("file.txt");
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
fis.close();

二、NIO(new input/output)

NIO 是 Java 在 JDK 1.4 中引入的新的 IO 库,相较于传统 IO,它提供了非阻塞式的 I/O 操作。NIO 使用 通道(Channel) 和 缓冲区(Buffer) 来进行数据的读写。
1、特点:
非阻塞式(Non-blocking):NIO 通过Selector(选择器)和Channel(通道)来支持非阻塞I/O操作。允许线程在等待数据时做其他事情,一个线程可以处理多个通道上的I/O操作。
异步:非阻塞I/O操作使得程序能够在等待I/O操作完成的同时,继续执行其他任务,从而提高了系统性能。
支持大文件和高并发:NIO更适合处理大量数据和高并发请求。
NIO 是 Java 在 JDK 1.4 中引入的新的 IO 库,相较于传统 IO,它提供了非阻塞式的 I/O 操作。NIO 使用 通道(Channel) 和 缓冲区(Buffer) 来进行数据的读写。
基于事件驱动:NIO 通过 Selector 机制(监听多个通道上的事件),可以让一个线程管理多个 I/O 操作。

2、主要类:

  • Channel(通道):可以用来读写数据,常见的通道类有 FileChannel、SocketChannel、DatagramChannel 等。

  • Buffer(缓冲区):数据的读写都发生在缓冲区中,通过 ByteBuffer、CharBuffer 等类来管理数据。

  • Selector(选择器):通过选择器,一个线程可以管理多个通道的 I/O 操作。

3、 示例:

// 使用 NIO 读取文件内容
Path path = Paths.get("file.txt");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(path, charset)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}

三、IO 和 NIO 的区别

特点IONIO
阻塞/非阻塞阻塞式,读写时会阻塞当前线程非阻塞式,线程可以在等待 I/O 时继续做其他工作
模型基于流(Stream)的模型基于通道(Channel)和缓冲区(Buffer)模型
适用场景适用于少量数据或简单应用适用于大规模数据、高并发、长时间连接等场景
多线程支持每个线程处理一个 I/O 操作,需要多个线程处理多个请求一个线程可以处理多个通道上的 I/O 操作
数据读取方式按顺序读取,通过流逐字节或逐行处理数据数据通过缓冲区(Buffer)批量读取和写入
使用难度简单易用,学习曲线较低相对复杂,学习曲线较高,需要理解缓冲区、选择器等概念
性能在高并发场景下性能较低高性能,尤其适用于高并发、大文件处理等场景

四、NIO 中通道和选择器的概念

一、通道(Channel)

通道 是 NIO 中用于数据传输的主要组件。它类似于传统 I/O 中的流,但在设计上更为灵活和高效。通道是双向的,即可以同时进行读取和写入操作。

1️⃣ 通道的概念

通道(Channel)代表了连接 I/O 操作的媒介。你可以通过通道来执行读取和写入操作,通道本身并不直接存储数据,而是通过缓冲区(Buffer)来与数据交互。

2️⃣ 通道的主要类型

NIO 中的通道有多种类型,常见的有:

  • FileChannel:用于文件 I/O 操作,提供文件的读取和写入功能。

    • 示例:用于读取文件中的字节或将数据写入文件。
  • SocketChannel:用于网络 I/O 操作,通过 TCP 协议与远程计算机进行通信。

    • 示例:用于客户端与服务器之间的数据传输。
  • DatagramChannel:用于通过 UDP 协议进行网络 I/O 操作。

    • 示例:用于实时性要求较高的通信,像 DNS 查询、VoIP(语音通信)等。
  • ServerSocketChannel:用于服务器端监听并接受客户端连接请求。

    • 示例:用来实现一个基于 NIO 的服务器。

3️⃣ 通道的基本操作

通道的基本操作包括 读 和 写,但是通道本身并不直接处理数据,它通过 缓冲区(Buffer) 来执行数据的存储和传输。

  • 读取数据:read() 方法会把数据从通道中读取到缓冲区。

  • 写入数据:write() 方法会把缓冲区中的数据写入到通道中。

// 示例:使用 FileChannel 读取文件
FileChannel channel = new FileInputStream("file.txt").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);  // 读取文件内容到缓冲区

4️⃣ 通道与流的区别

  • 流(Stream):一次只能操作一个方向的数据传输(只能读取或写入)。

  • 通道(Channel):可以双向操作数据(既能读也能写)。

二、选择器(Selector)

选择器 是 NIO 中用于实现多路复用(Multiplexing)的核心组件。它允许一个线程同时管理多个通道(Channel),并能够处理多个 I/O 操作,而不需要为每个通道创建独立的线程。

1️⃣ 选择器的概念

选择器(Selector)是一个多路复用器,用于检查多个通道的状态。通过选择器,线程可以监控多个通道上的事件(如是否可读、可写、连接已完成等),当事件发生时,线程才会处理这些通道上的操作。

2️⃣ 选择器的工作流程

注册通道:将通道注册到选择器,并指定感兴趣的事件(如 OP_READ、OP_WRITE、OP_CONNECT 等)。

轮询事件:选择器不断轮询各个注册的通道,检查它们的状态,若某个通道准备好进行 I/O 操作(如数据可以读取或写入),就会将该通道加入到已选择的通道列表中。

处理 I/O 操作:当事件发生时,线程可以对该通道执行相应的 I/O 操作。

3️⃣ 选择器的核心方法

open():创建一个新的选择器。

select():阻塞并等待通道事件的发生,返回就绪的通道数。

selectedKeys():返回一个包含已就绪通道的集合,可以通过它来遍历就绪的通道并进行操作。

// 示例:使用 Selector 监听通道事件
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);  // 设置为非阻塞模式
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();  // 阻塞直到有事件发生
Set<SelectionKey> selectedKeys = selector.selectedKeys();for (SelectionKey key : selectedKeys) {if (key.isAcceptable()) {// 处理连接请求} else if (key.isReadable()) {// 处理读取事件}selectedKeys.remove(key);}}

4️⃣ 选择器的事件类型

OP_READ:通道可读,数据可以从通道读取。

OP_WRITE:通道可写,数据可以写入通道。

OP_CONNECT:连接已经建立。

OP_ACCEPT:服务器端通道准备好接受新的客户端连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1175022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVGL 双缓冲机制深入技术讲解

LVGL 双缓冲机制深入技术讲解全面深入讲解 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;的双缓冲、DMA 并行刷新、瓦片渲染与性能优化第一部分&#xff1a;核心概念与原理 1. 为什么需要缓冲&#xff1f;——从根本问题说起 在没有缓冲的情况下&#xff…

LeeCode_693. 交替位二进制数

693. 交替位二进制数 给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。 示例 1: 输入:n = 5 输出:true 解释:5 的二进制表示是:101法一:只要有前…

java的AES加密算法和RSA非对称加密算法

一、AES加密算法:import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.util.Base64;public class AESEncryption …

图的基本概念

11图的基本概念

GESP认证C++编程真题解析 | 202409 一级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

物联网数据中台建设方法论与实践

好的&#xff0c;请看这篇文章。 标题选项 物联网数据中台的终极指南&#xff1a;从概念到落地实践解锁万物互联的宝藏&#xff1a;物联网数据中台建设方法论与实践详解告别数据孤岛&#xff1a;构建支撑海量IoT数据的智能中台从设备到洞察&#xff1a;手把手教你构建企业级物联…

探寻不锈钢管板好货源?2026年国内厂家推荐,高温合金法兰/压力容器法兰/非标法兰/双相钢法兰,不锈钢管板公司有哪些 - 品牌推荐师

行业背景与趋势洞察 随着国内制造业向高端化、精密化转型,不锈钢管板作为压力容器、管道系统及特种装备的核心部件,其质量稳定性与定制化能力直接影响下游产业的安全性与生产效率。2025年行业数据显示,国内不锈钢管…

【计算机毕业设计案例】基于机器学习 python-CNN-pytorch训练识别苹果树叶病害识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

java-ssm324医院预约挂号系统vue问诊 失信 投诉-springboot

目录具体实现截图系统概述技术架构核心功能创新亮点应用价值系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 系统概述 Java-SSM324医院预约挂号系统结合Vue前端与SpringBoot后端技术&#xff0c…

深度学习毕设项目推荐-基于python-CNN卷积神经网络训练识别不同颜色的裤子识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

一篇文章看懂 spring-boot-starter-web 的 POM 配置与 compile 作用域

在 Spring Boot 项目开发中&#xff0c;spring-boot-starter-web 是搭建 Web 应用的核心依赖。很多开发者查看它的 POM 文件时&#xff0c;会对其中的 <scope>compile</scope> 配置产生疑问&#xff1a;这个配置到底对不对&#xff1f;它的作用是什么&#xff1f;今…

2026年目前服务好的双相钢法兰供应商选哪家,不锈钢法兰/双相钢法兰/非标法兰/变压器法兰,双相钢法兰直销厂家排行 - 品牌推荐师

在工业管道系统中,双相钢法兰作为连接管道与设备的关键部件,其耐腐蚀性、高强度和抗疲劳性能直接影响着石化、船舶、核电等重工业领域的安全生产与作业效率。据中国机械工业联合会及管道工程协会联合发布的《2025-20…

Maven 依赖作用域实战避坑指南

在 Maven 项目开发中&#xff0c;依赖作用域的配置直接影响项目的编译、测试和打包结果&#xff0c;稍有不慎就会引发 ClassNotFoundException、依赖包冗余等问题。结合日常开发场景&#xff0c;本文整理了常见的作用域使用误区和解决方案&#xff0c;帮你精准避坑。一、 高频误…

2026年目前做得好的变压器法兰品牌有哪些,不锈钢管板/压力容器法兰/不锈钢法兰/法兰/船用法兰,变压器法兰厂家推荐 - 品牌推荐师

随着电力设备向高电压、大容量、智能化方向发展,变压器法兰作为连接变压器与管道系统的核心部件,其质量直接影响电力系统的安全与效率。当前,行业面临技术迭代加速、非标需求激增、交付周期缩短等挑战,采购方亟需兼…

深度学习毕设项目推荐-基于python-CNN-pytorch训练识别苹果树叶病害识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

企业估值中的可穿戴设备市场评估

企业估值中的可穿戴设备市场评估 关键词:企业估值、可穿戴设备、市场评估、财务模型、竞争分析、技术趋势、投资决策 摘要:本文深入探讨了在企业估值过程中如何评估可穿戴设备市场的关键要素。我们将从市场背景、技术趋势、财务模型构建等多个维度,系统地分析可穿戴设备企业…

基于微信小程序的宠物寄领养系统(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。一、程序背景随着城市化进程加快与居民生活水平提升&#xff0c;宠物成为众多家庭的重要成员&#xff0c;…

10 分钟使用 OrchardCore 快速构建 .NET 内容管理系统(CMS)

目录 前言 项目介绍 项目特点 支持数据库 项目源代码 创建 Orchard Core CMS 网站 CMS 网站后台管理页面 菜单栏编辑 内容管理 主题切换 角色权限管理 创建网站用户 图片管理 其他功能 项目源码地址 优秀项目和框架精选 前言 今天我们来使用 OrchardCore 来快…

深度学习毕设项目推荐-基于python-CNN深度学习训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

C# 的小惊喜:ValueTuple,让多返回值更优雅,性能更强

目录 ValueTuple&#xff08;值元组&#xff09; 入门 给元素起名字 返回多个值 解构赋值 Tuple vs ValueTuple 性能测试 应用场景 总结 在日常 C# 开发中&#xff0c;我们经常会遇到这样的需求&#xff1a; &#x1f449; 一个方法需要返回多个值。 在 C# 7.0 之前&a…