当前位置: 首页 > news >正文

java当中什么是NIO

Java中的NIO(Non-blocking I/O)即非阻塞I/O,是Java 1.4中引入的一种新的I/O API,用于替代传统的I/O(即BIO, Blocking I/O)。与传统的阻塞式I/O相比,NIO提供了更高效的I/O操作,特别是在处理大量并发连接时表现更好。NIO通过使用通道(Channel)和缓冲区(Buffer)来实现对I/O操作的非阻塞处理。本文将从NIO的基本概念、核心组件、常见用法、与BIO的对比及其优缺点等多个方面详细介绍Java中的NIO。

一、NIO的基本概念

NIO全称为Non-blocking I/O,直译为非阻塞I/O。传统的I/O操作通常是阻塞的,即在进行I/O操作时,程序会被阻塞,直到操作完成。而NIO允许程序在不阻塞的情况下执行I/O操作,即程序可以在等待I/O操作完成的同时执行其他任务,从而提升系统的并发能力和资源利用率。

NIO主要引入了以下三个核心概念:

  1. 通道(Channel):通道可以看作是一个连接源和目标的通道,数据可以通过通道从一个地方传输到另一个地方。通道类似于传统的流(Stream),但与流不同的是,通道是双向的,可以用于读、写或同时进行读写操作。

  2. 缓冲区(Buffer):缓冲区是一个用于存储数据的容器,所有数据都是通过缓冲区进行处理的。缓冲区本质上是一个数组,但它提供了对数据的结构化访问以及维护读写位置的功能。

  3. 选择器(Selector):选择器是NIO中的一个重要组件,它可以用于监听多个通道的事件(如连接请求、数据到达等)。通过选择器,程序可以在一个线程中处理多个通道,从而大大提高了I/O处理的效率。

二、NIO的核心组件

Java NIO由以下几个核心组件构成,这些组件共同提供了高效的I/O操作能力:

  1. 通道(Channel)
       - FileChannel:用于文件数据的读写操作。
       - SocketChannel:用于网络数据的TCP连接。
       - ServerSocketChannel:用于监听新的TCP连接,就像传统的ServerSocket一样。
       - DatagramChannel:用于UDP连接的读写操作。

  2. 缓冲区(Buffer)
       - ByteBuffer:用于存储字节数据。
       - CharBufferIntBufferLongBufferFloatBufferDoubleBuffer等:分别用于存储不同类型的基本数据类型。

  3. 选择器(Selector)
       - 选择器用于监控多个通道的事件,支持非阻塞I/O操作。通过调用选择器的select()方法,可以知道有哪些通道准备好了I/O操作。

三、NIO的常见用法

1. 文件I/O操作

NIO提供了FileChannel用于文件的读写操作。与传统的FileInputStreamFileOutputStream不同,FileChannel可以通过ByteBuffer进行非阻塞读写操作。

RandomAccessFile file = new RandomAccessFile("data.txt", "rw");
FileChannel channel = file.getChannel();ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = channel.read(buffer);while (bytesRead != -1) {buffer.flip(); // 切换为读模式while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear(); // 清空缓冲区,为下次写入数据做好准备bytesRead = channel.read(buffer);
}file.close();
2. 网络I/O操作

NIO的SocketChannelServerSocketChannel提供了对网络连接的非阻塞处理。下面是一个简单的基于NIO的Echo服务器的示例:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectedKeys.iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();if (key.isAcceptable()) {// 接受新的连接SocketChannel clientChannel = serverSocketChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {// 读取数据SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(256);clientChannel.read(buffer);buffer.flip();clientChannel.write(buffer);buffer.clear();}iterator.remove(); // 移除已处理的键}
}

四、NIO与BIO的对比

  1. 阻塞与非阻塞
       - BIO:采用阻塞I/O模式,线程在进行I/O操作时会被阻塞,无法处理其他任务。
       - NIO:采用非阻塞I/O模式,线程可以在I/O操作未完成时继续处理其他任务,提高了系统的并发能力。

  2. I/O多路复用
       - BIO:通常需要为每个客户端连接创建一个独立的线程,这在大量并发连接的情况下会带来巨大的线程开销。
       - NIO:通过选择器(Selector)实现I/O多路复用,能够在一个线程中处理多个通道,减少了线程的开销。

  3. 性能
       - BIO:适用于连接数较少且处理时间较长的场景,如传统的单线程服务器。
       - NIO:适用于连接数较多且连接较短的场景,如高并发的聊天服务器、游戏服务器等。

五、NIO的优缺点

优点:
  1. 高效处理并发连接:NIO通过非阻塞I/O和选择器机制能够在单线程中处理大量并发连接,适合高并发场景。
  2. I/O多路复用:NIO允许多个通道共用一个线程进行管理,减少了线程的资源消耗。
  3. 灵活性:NIO的通道、缓冲区、选择器提供了比传统I/O更为灵活的数据处理方式。
缺点:
  1. 编程复杂度高:与BIO相比,NIO的编程模型更复杂,开发者需要管理选择器、通道、缓冲区等多个组件,这增加了代码的复杂性。
  2. 适用场景有限:NIO的优势在于高并发场景,但对于低并发、长连接的场景,BIO可能会更简单高效。

六、NIO的应用场景

NIO广泛应用于需要高并发处理的场景,以下是一些常见的应用场景:

  1. 高并发网络服务器:如HTTP服务器、聊天服务器、游戏服务器等,通过NIO可以在一个或少量线程中处理大量并发请求。
  2. 文件处理:NIO的FileChannel提供了对文件的高效读写操作,特别是对于大文件的处理,NIO能够显著提升性能。
  3. 事件驱动架构:NIO中的选择器机制非常适合用于事件驱动的应用,如GUI框架、事件处理系统等。

结语

Java NIO作为一种高效的I/O处理方式,特别适合于需要处理大量并发连接的场景。通过使用通道、缓冲区和选择器,NIO在提供非阻塞I/O操作的同时,也提供了灵活的数据处理能力。尽管NIO的编程模型比传统的BIO更为复杂,但在高并发、高性能的应用中,NIO无疑是一个值得选择的解决方案。随着Java的发展,NIO已经成为Java生态中不可或缺的重要组成部分,未来它在高性能计算和并发处理领域将继续发挥重要作用。

相关文章:

java当中什么是NIO

Java中的NIO&#xff08;Non-blocking I/O&#xff09;即非阻塞I/O&#xff0c;是Java 1.4中引入的一种新的I/O API&#xff0c;用于替代传统的I/O&#xff08;即BIO, Blocking I/O&#xff09;。与传统的阻塞式I/O相比&#xff0c;NIO提供了更高效的I/O操作&#xff0c;特别是…...

【基础】Three.js 自定义几何体和复制几何体

通过自定义顶点数据&#xff0c;可以创建任意的几何体。像threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry类构建的&#xff0c;它表示一个没有任何形状的空几何体。 1. 自定义点模型 通过javascript 类型化数组 Float32Array创建一组xyz坐标…...

如何使用ChatGPT进行高效的对话生成与优化

目录 一、对话生成的基础原理 二、如何优化对话生成的流畅性与上下文关联性 1. 提示词优化&#xff1a;明确上下文和期望目标 示例&#xff1a;提示词优化 2. 调整生成参数&#xff1a;控制生成长度与内容多样性 示例&#xff1a;调整生成参数 3. 上下文管理&#xff1a…...

MySQL系列—8.存储结构

目录 1.系统表空间 ibdata 2.通用表空间 .ibd 3.独立表空间 4.Undo 表空间 5.临时表空间 6.Redo Log File 1.系统表空间 ibdata 系统表空间由参数innodb_data_file_path定义路径、初始化大小、自动扩展策略 如&#xff1a; innodb_data_file_path/dayta/mysql/ibdata1:…...

vue2、vue3生成二维码

Vue2版&#xff1a; 工具&#xff1a;使用 qrcodejs插件来生成二维码 安装&#xff1a;npm install qrcodejs2 qrcodejs官网地址&#xff1a; https://davidshimjs.github.io/qrcodejs/https://davidshimjs.github.io/qrcodejs/ 代码示例&#xff1a; <template><…...

Spring Cloud全解析:熔断之Hystrix线程隔离导致的问题

Hystrix线程隔离 在微服务框架中&#xff0c;可能一个服务需要调用多个微服务&#xff0c;在tomcat中运行时&#xff0c;tomcat只是分配了100个线程&#xff0c;由于多个服务之间调用的时间消耗过长&#xff0c;可能会导致线程耗尽&#xff0c;而在Hystrix中存在线程隔离&…...

网络编程项目(云词典项目)

目录 一、功能要求 服务器 用户客户端 二、演示效果 1.登录、注册功能 2. 查单词功能 3.查看历史纪录功能 三、项目代码 1.头文件 2.服务器 3.用户端 一、功能要求 仿照云词典的原理&#xff0c;实现云词典功能&#xff0c;用户可以查询输入的单词的英文解释&…...

Java Spring Boot 项目中的密码加密与验证开发案例手册

本手册主要针对Java项目中的账号密码加密与验证进行详细的步骤讲解和代码示例。适用于开发登录认证、用户管理等功能的场景。文档包含工具类的创建、数据库配置、服务层和控制器层的集成等常见操作。 1. 常用加密操作 在实现安全的登录功能时&#xff0c;密码加密与验证是不可…...

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示&#xff0c;本人在vue3typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码&#xff0c;发现typescript一直报 查询vuesax的目录文件发现存在ts文件&#xff0c;于是乎觉得是自己的问题&#xff0c;就查阅gpt与网上资料&#x…...

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…...

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…...

大数常用API

package API;public class BigNum {//如果普通的long和double的精度不足以满足要求&#xff0c;那么可以使用java.math包中的两个类//BigInteger和BigDecimal//前者实现任意精度的整数运算&#xff0c;后者实现任意精度的浮点数运算//BigInteger add(BigInteger other)//BigInt…...

Gartner发布ASCA自动化安全控制评估创新洞察:三年后40%的综合安全厂商都将提供ASCA功能

复杂的安全控制网络、技能差距和快速变化的攻击技术使维持技术安全控制的最佳配置的问题更加复杂。安全和风险管理领导者可以通过自动化安全控制评估来改善他们的安全状况。 主要发现 技术安全控制配置错误是与安全漏洞相关的长期问题。薄弱的安全默认值、配置漂移、为减少误报…...

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …...

php代码实例强制下载文件代码例子

php代码实例强制下载文件代码例子 $filename $_GET[file]; //Get the fileid from the URL // Query the file ID $query sprintf("SELECT * FROM tableName WHERE id %s",mysql_real_escape_string($filename)); $sql mysql_query($query); if(mysql_num_rows…...

Opencv中的直方图(3)直方图比较函数compareHist()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 比较两个直方图。 函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。 该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1​,H2​…...

压力测试(内存、磁盘、网络、cpu)

压力测试 1. 内存压力测试工具stressmemtester 2. 磁盘压力测试工具fio (Flexible I/O Tester)dd (Data Duplicator) 3. 网络压力测试工具iperf3speedtest-cli 4. CPU压力测试工具stress-ng 为了满足更详细的需求&#xff0c;以下是针对内存、磁盘和网络压力测试工具的更深入介…...

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果 核心代码完整代码&#xff1a;在线示例 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类&#xff0c;可以添加数据以及操作 FBO&#xff08;ManagedFBO&#xff09;&#…...

Java 设计模式-代理模式

目录 概述 一. 什么是代理模式 1. 举例说明 二. 代理模式作用 1. 保护代理 2. 增强功能 3. 代理交互 4. 远程代理&#xff1a; 三. 代理模式3个角色 四. 静态代理 1. 代码示例&#xff1a; 五. JDK动态代理 1. 代码示例&#xff1a; 六. CGLIB 动态代理 1.代码示…...

CTF靶场之BUUCTF介绍

最后开始关注CTF&#xff0c;我们先了解一下什么CTF:CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式,最后以夺取FLAG为成功。 从网上找了一个免费的靶场——BUUCTF&#xf…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...