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服务器设计- 一个连接通过一个线程处理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebPack的使用及属性配、打包资源

WebPack(静态模块打包工具)(webpack默认只识别js和json内容) WebPack的作用 把静态模块内容压缩、整合、转译等(前端工程化) 1️⃣把less/sass转成css代码 2️⃣把ES6降级成ES5 3️⃣支持多种模块文件类型,多种模块标准语法 export、export…

企业如何有效防止员工偷懒磨洋工?

在当今竞争激烈的商业环境中,企业要想保持竞争力和提高效益,就必须确保员工不偷懒不磨洋工。然而,要有效防止员工偷懒磨洋工并非易事,需要企业采取一系列措施来引导和监督员工的工作状态。 下面就分享三个有效防止员工偷懒磨洋工…

unity3d for web

时光噶然 一晃好多年过去了(干了5年的u3d游戏),记得最后一次使用的版本好像是 unity 2017。 那个是 unity3d for webgl 还需要装个插件。用起来很蛋疼。 最近做一个小项目 在选择是用 Layabox 还是 cocosCreate 的时候 我想起了老战友 Uni…

DeepMind终结大模型幻觉?标注事实比人类靠谱、还便宜20倍,全开源

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源​ 发布在https://it.weoknow.com 更多资源欢迎关注 ​ DeepMind 这篇论文一出,人类标注者的饭碗也要被砸了吗&a…

警惕.360勒索病毒:如何预防.360勒索病毒攻击

导言: 在网络安全领域,勒索病毒是一种非常危险的恶意软件,它以其独特的加密方式和高昂的赎金要求,给个人和企业带来了严重的损失。.360勒索病毒便是其中之一,它属于BeijingCrypt勒索病毒家族,具有高度的隐…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项样卷

#需要资源(软件包及镜像)或有问题的,可私博主!!! #需要资源(软件包及镜像)或有问题的,可私博主!!! #需要资源(软件包及镜…

iOS网络抓包工具全解析

摘要 本文将深入探讨iOS平台上常用的网络抓包工具,包括Charles、克魔助手、Thor和Http Catcher,以及通过SSH连接进行抓包的方法。此外,还介绍了克魔开发助手作为iOS应用开发的辅助工具,提供的全方面性能监控和调试功能。 在iOS应…

2024年妈妈杯数学建模思路A题B题C题D题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

AI预测福彩3D第20弹【2024年3月28日预测--第5套算法开始计算第2次测试】

今天,咱们继续进行本套算法的测试,今天为第二次测试,仍旧是采用冷温热趋势结合AI模型进行预测。好了,废话不多说了。直接上结果~ 仍旧是分为两个方案,1大1小。 经过人工神经网络计算并进行权重赋值打分后,3…

【论文阅读】ELA: Efficient Local Attention for Deep Convolutional Neural Networks

(ELA)Efficient Local Attention for Deep Convolutional Neural Networks 论文链接:ELA: Efficient Local Attention for Deep Convolutional Neural Networks (arxiv.org) 作者:Wei Xu, Yi Wan 单位:兰州大学信息…

【MySQL探索之旅】MySQL数据表的增删查改——约束

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…

【学习】企业为什么要做信创适配性测试

信创产业的发展不仅关乎国家的信息安全和自主可控,也直接关系到经济社会的创新和转型升级。因此,国家积极出台了一系列支持政策,以促进信创产业的快速发展。在各项政策出台的推动下,信创产品已经成为越来越多企业和机构的首选。信…

骨传导耳机哪个牌子值得入手?公认口碑排行前5名,强烈推荐!

我作为一名数码达人,对各类数码产品都了解的比较多,最近也会被很多人询问关于骨传导耳机哪个牌子好,哪个牌子值得入手的问题,后面了解后发现很多人入手的骨传导耳机都是劣质产品,在使用中经常遇到各类问题,…

【Go】结构体中Tag标识

https://blog.csdn.net/weixin_45193103/article/details/123876319 https://blog.csdn.net/qq_49723651/article/details/122005291 https://juejin.cn/post/7005465902804123679 学一点,整一点,基本都是综合别人的,弄成我能理解的内容 Tag定…

【JavaSE】java刷题——基础语法熟练应用

前言 通过本篇题目,可以让初学Java的小伙伴们更加熟练Java的基础语法~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 题1:数字9 出现的次数 题述:编写程序数一下 1到 100 的所有整数中…

四平方和定理

四平方和定理:任意一个正整数都可以被表示为至多四个正整数的平方和。 更强的结论:当且仅当时,n可以被表示为至多三个正整数的平方和,因此,当时,n只能被表示为四个正整数的平方和。 如果 ,这个时…

Leetcode - 周赛390

目录 一,3090. 每个字符最多出现两次的最长子字符串 二,3091. 执行操作使数据元素之和大于等于 K 三,3092. 最高频率的 ID 四,3093. 最长公共后缀查询 一,3090. 每个字符最多出现两次的最长子字符串 本题是一道标准…

JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1 2.17 模拟Spring IOC容器功能-2 什么是IOC? 控制反转,把对象创建和对象之间的调用过程交给Spring框架进行管理使用IOC的目的:为了耦合度降低 解释: 模仿 IOC容器的功能,我们利用 Map…

LeetCode 206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3: …

这款基于Vue的大数据可视化平台,你绝对值得拥有

这款基于Vue的大数据可视化平台,你绝对值得拥有 一、项目介绍二、相关技术栈三、运行步骤四、项目演示五、总结 大家好,这里是程序猿代码之路。今天主要给大家介绍一款基于Vue的可视化数据大屏。在数字化转型的浪潮中,大数据的可视化展示变得…