Java NIO和IO之间的区别

前言

NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

1、面向流与面向缓冲

     Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

2、阻塞与非阻塞IO

     Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

3、选择器

     Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

NIO和IO的区别

1)设计理念不同。传统IO是基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)。
2)性能不同。传统IO是阻塞的,意味着当一个线程进行读或写操作时,如果操作没有完成,该线程会被阻塞,直到数据准备好或写入完成。而NIO是非阻塞的,允许线程在等待数据时执行其他任务,从而提高了多任务处理能力。
3)并发处理能力不同。传统IO适用于低并发场景,每个连接通常由一个独立的线程处理,而NIO适用于高并发场景,能够更好地处理大量连接,减少线程数量,提高系统性能。
4)面向流与面向缓冲不同。传统IO面向流,每次操作都是针对一个字节或多个字节,而NIO面向缓冲区,数据以块的形式被处理和传输。
5)线程模型不同。传统IO通常使用一个线程处理一个连接,而NIO使用一个线程管理多个通道,从而提高了资源利用率。
6)选择器不同。NIO引入了选择器机制,允许一个线程同时监听多个通道的IO事件,提高了IO处理的效率和灵活性。

总结

NIO可以让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。

如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络(也叫对等网络)中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。一个线程多个连接的设计方案如下图所示:

Java NIO: 单线程管理多个连接

如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:

Java IO: 一个典型的IO服务器设计- 一个连接通过一个线程处理

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

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

相关文章

Python笔记|列表

Python 支持多种复合数据类型,可将不同值组合在一起。最常用的是列表——用方括号标注,逗号分隔的一组值。列表可以包含不同类型的元素,一般情况下,各个元素的类型相同: >>> squares [1, 4, 9, 16, 25] &g…

Vue3中基本数据类型为什么需要.value,,,引用类型不需要.value

1、在v3中使用基本数据类型(如数字、字符串、布尔值)时,如果你希望响应式地更新数据并触发视图更新,需要使用ref包裹基本数据类型,然后将基本数据类型转化为响应式对象;- - - 因此当你使用ref包裹基本数据类型时,实际上得到的是一个包含.valu…

【DFS+贪心】第十四届蓝桥杯省赛C++ B组《飞机降落》(C++)

【题目描述】 有 N 架飞机准备降落到某个只有一条跑道的机场。 其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 TiDi 时刻开始降落。 降落过程需要 L…

B002-springcloud alibaba 微服务环境搭建

目录 创建父工程创建基础模块创建用户微服务创建商品微服务创建订单微服务微服务调用 创建父工程 新建项目springcloud-alibaba&#xff0c;本工程不需要写代码&#xff0c;删除src 导包 <parent><groupId>org.springframework.boot</groupId><artifact…

Linux上Mysql安装和部署(图文结合超详细)

1、首先将虚拟机装成功&#xff08;这里不做演示&#xff09; 2、df-h 查看光盘是否挂载&#xff0c;已挂载进行下一步&#xff0c;未挂载手动挂载 2.1、手动挂载 mount -o ro /dev/sr0 /media3、进入etc/yum.repos.d目录查看仓是否配置&#xff0c;若配置进行下一一步&#…

360企业安全浏览器兼容模式显示异常某个内容不显示 偶发现象 本地无法复现情况js

360企业安全浏览器兼容模式显示异常 &#xff0c;现象测试环境频发 &#xff0c;本地连测试无法复现&#xff0c;线上反馈问题。 出现问题的电脑为windows且使用360企业安全浏览器打开兼容模式可复现 复现过程&#xff1a; 不直接点击超链接跳转页面 &#xff0c;登录后直接通…

C++ 侯捷 程序设计(Ⅱ)兼谈对象模型 笔记

Conversion function 转换函数 侯捷老师使用分数 Fraction举例&#xff0c;分数理应可以被看作是小数 提供了Fraction类对象一个转换为double的方法&#xff0c;当碰到需要转换为double的情况下&#xff0c;会调用该方法。 黄色的就是转换函数&#xff0c;没有return type&am…

Python+appium自动化测试之如何控制App的启动和退出

由于本人使用的是Android设备做自动化测试&#xff0c;所以以下内容均基于Android系统做出的整理 一、启动app 启动app需要设置Capability参数&#xff0c;而Capability参数放在Desired Capalibity中&#xff0c;Desired Capalibity告诉Appium想要的自动化平台和应用程序&…

Flutter与Xamarin跨平台APP开发框架的区别

嘿&#xff0c;各位亲爱的朋友们&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我们要探讨的话题是&#xff1a;Flutter与Xamarin这两款热门的跨平台APP开发框架。我深知选择合适的开发工具对于开发者来说有多么重要。那么&#xff0c;当我们需要开发跨平台应用时…

【机器学习】基于正余弦搜索算法优化的BP神经网络分类预测(SCA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】正余弦优化算法&#xff08;SCA&#xff09;原理及实现 2.设计与实现 数据集&#xff1a; 多输入多输出&#xff1a;样本特征24&#xff0c;标签类…

高德地图——轨迹回放和电子围栏

功能点 地图的初始化显示电子围栏&#xff08;先初始化在调接口显示电子围栏&#xff09;显示定位显示轨迹轨迹回放 &#xff08;回放速度无法控制是因为高德地图的版本问题&#xff0c;不要设置版本&#xff0c;使用默认的即可生效&#xff09;获取当前城市及天气情况设置地图…

【漏洞复现】金和OA IncentivePlanFulfill.aspx SQL注入漏洞

0x01 产品简介 金和OA协同办公管理系统C6软件&#xff08;简称金和OA&#xff09;&#xff0c;本着简单、适用、高效的原则&#xff0c;贴合企事业单位的实际需求&#xff0c;实行通用化、标准化、智能化、人性化的产品设计&#xff0c;充分体现企事业单位规范管理、提高办公效…

黑马现有java课程框架及其功能梳理

目录 高并发相关提高通信效率Netty作用&#xff1a;哪些框架使用它&#xff1a; ChannelChannelHandler 和 ChannelPipelineEventLoop 和 EventLoopGroup**涉及的名词解释&#xff1a;**NIOSocketNginx 高并发相关 主要用来解决IO密集型程序&#xff08;大量文件读写&#xff…

盲盒小程序有什么优势?如何运营获客?

盲盒作为当下的热门行业&#xff0c;已经在国内外成功站稳脚步&#xff0c;市场规模庞大。 线上盲盒小程序也是互联网电商下的新模式&#xff0c;将传统的盲盒模式与线上电商模式相结合&#xff0c;为消费者提供一种新颖额盲盒购买体验&#xff0c;玩家在手机上就可以体验到抽…

C#实现FPGA自动烧录(Vivado)

需要提前安装Vivado Lab 打开控制面板 /// <summary>/// 进程初始化&#xff0c;并打开进程/// </summary>public static void InitAndStart(){process new Process();process.StartInfo.FileName "cmd.exe";process.StartInfo.UseShellExecute fals…

HBase Shell的应用案例

电商( eshop)平台具有海量数据、高并发访问、高速读写等特征&#xff0c;适合使用HBase分布式数据库进行数据存储。本节通过一个 HBase在电商平台的应用案例&#xff0c;熟练掌握并综合运用HBase Shell命令行终端提供的各种操作命令。 一、电商(eshop)平台的逻辑数据模型 在H…

【医疗-单位计算】

医疗-单位计算 ■ 体重模式下单位计算■ 剂量&#xff08;mg/kg&#xff09;■ 剂量速度&#xff08;mg/kg/h&#xff09;■ 溶度&#xff08;mg/ml&#xff09;■ 运行速度&#xff08;ml/h&#xff09; ■ 体重模式下单位计算 ■ 剂量&#xff08;mg/kg&#xff09; ■ 剂量…

HTML5+CSS3小实例:具有悬停效果的3D闪耀动画

实例:具有悬停效果的3D闪耀动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, init…

使用python和perl语言实现xlsx转化为csv

下面提供使用 Python 和 Perl 两种常用语言的示例代码&#xff0c;来实现将 Excel 文件 (.xlsx) 转换为 CSV 文件。 首先是 Python 的示例代码&#xff1a; 使用 Python 实现 xlsx 转换为 csv&#xff1a; # 导入所需模块 import pandas as pd# 读取 Excel 文件并写入 CSV 文…

Linux 查看防火墙相关命令

1、查看防火墙状态 systemctl status firewalld 2、启动防火墙 systemctl start/restart firewalld 3、停止防火墙 临时停用&#xff0c;重启后失效 systemctl stop firewalld 4、永久停止防火墙 systemctl disable firewalld 5、开机启动 systemctl enable firew…