Java NIO与IO区别

Java常见面试题汇总-----------Java基础(NIO与IO的区别) 18. NIO与IO的区别   NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。   NIO和IO的主要区别,下表总结了Java IO和NIO之间的主要区别: IO NIO 面向流... 阅读详情

面向流和面向缓冲

  • NIO和IO之间的一个最大的区别就是,IO是面向流的,而NIO是面向缓冲区的。
  • IO是面向流的,意味着每次从流中读取一个或多个字节,直到读取所有字节,它们没有被缓存在任何地方。此外,流是单向的,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,则需要把数据缓存到一个缓存区中。
  • NIO是面向缓冲区的,数据被读取到一个它稍后处理的缓冲区,需要时可以在缓冲区中前后移动。这就增加了处理过程中的灵活性。需要注意的是,我们需要检查缓冲区中是否有我们需要的数据。而且,需确保当更多的数据读入缓冲区时,尚未处理的数据不会被覆盖。

阻塞和非阻塞

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

选择器

选择器是NIO独有的组件。我们可以注册多个通道来使用一个选择器,然后使用一个线程来管理选择器。选择器可以监视这些通道中已经可以处理的输入,或者已准备写入的通道。这种选择机制,是的一个单独的线程可以用来管理多个通道。

NIO和IO对程序设计的影响

API调用

NIO和IO的API调用不同,但这并不意外,因为IO是逐字节读取的,NIO是先读取缓冲区在进行处理的。

数据处理

  • 使用NIO设计较IO设计,数据处理也收到影响。
  • 在IO设计中,我们从InputStream或OutputStream逐字节读取数据。如下基于行的文本数据流:
Name: Anna
Age: 25
Email: anna@mailserver.com
Phone: 1234567890

基于IO设计处理如下:

BufferedReader reader = new BufferedReader(new InputStreamReader(input));

String nameLine   = reader.readLine();
String ageLine    = reader.readLine();
String emailLine  = reader.readLine();
String phoneLine  = reader.readLine();

readLine()方法会阻塞直到整行读完,一旦readLine()返回,你就知道文本行已读完。你会知道第一行包含名称。我们知道每步的数据是什么。一旦我们处理过某些数据,该线程不会在回退数据。如图所示:
IO处理
而NIO的实现有所不同,如下面一个简单的例子:

ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);

在第二行,我们读取数据到Buffer中。当这个方法返回时,我们并不知道所需的数据是否在缓存区中。我们仅仅知道的是,该缓冲区包含一下字节,这使得处理有些困难。
假设第一次read(buffer)调用后,读入缓冲区的数据只有半行,如“Name:An”,你能处理数据吗?显然不能,我们需要等待,知道整行数据都被读取缓存,在此之前,对数据的处理都毫无意义。
那么,我们怎么知道缓冲区的数据是否包含足够的数据可用处理呢?我们只能不断的检查几次缓存区的数据。这不仅效率低下,而且使得程序设计杂乱不堪。如下:

ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);

while(! bufferFull(bytesRead) ) {
	bytesRead = inChannel.read(buffer);
}

bufferFull()方法必须跟踪有多少数据写入缓冲区,并返回真假,这取决于缓冲区是否已满。如果缓冲区已满,它可以被处理。
通过bufferFull()方法扫描缓冲区,缓冲区必须保持和bufferFull()方法被调用之前相同的状态,如果不是,下一个读入缓冲区的数据可能无法被读到正确的位置,这并非不可能,但也暴露出另一个需要我们注意的问题。如下图:
NIO处理

用来处理数据的线程数

  • NIO可以用一个(或几个)单线程来管理多个通道(网络连接或文件),但代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
  • 如果需要同时管理打开的成千上万个连接,这些连接每次只是发送少量的数据,如聊天服务器,NIO可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络上,使用一个单独的线程来管理所有的出站连接,可能是一个优势。一个线程多个连接设计方案如下所示:
    一个线程多个连接
  • 如果有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:
    典型IO

多路复用IO的优缺点

  • 同一个端口可以处理多种协议。例如,使用ServerSocketChannel的服务器端口监听,可以处理TCP协议又可以处理UDP协议。
  • 都是同步IO:阻塞式IO,非阻塞式IO甚至包括多路复用IO,这些都是基于操作系统对同步IO的实现。同步IO的意思是,只有上层(包括上层的某种代理机制)系统询问我是否有某个事件发生了,否则我不会主动告诉上层系统事件发生了。
    参考并发编程网
什么是Java中的NIO?NIO与IO有什么区别? Java NIO,全称New IO,是Java 1.4版本中引入的一种新的IO处理方式。NIO与IO虽然有相同的作用和目的,但实现方式却大不相同。在传统的IO中,数据读取和写入是以字节流或字符流为单位进行的,每次从流中读取一个或多个字节,这些字节没有被缓存在任何地方,当需要前后移动流中的数据时,不能直接移动,需要先读取出来再重新写入。而NIO则主要用到的是块,它基于通道channel和缓冲区Buffer进行操作,支持非阻塞IO,效率要比IO高很多。 阅读详情

相关推荐

NVIDIA Jetson Xavier NX刷机+ROS安装+深度学习配置

.NVIDIA Jetson Xavier NX 完整说明流程 V1.0.0 – by Holden Date : 2021-03-19 文章目录.NVIDIA Jetson Xavier NX 完整说明流程1. Jetson Xavier NX简介2. Jetson Xavier NX刷机介绍2.1 工具准备工作2.2 下载镜像以及烧录工具2.3 烧录原生镜像到TF卡2.4 开机启动2.5 组件配置4. 镜像克隆制作5. 镜像重烧写6. NX调控命令 1. Jetson Xavier NX简介 ​ NVI

李老板Holden的博客 7619

Java中的NIO和IO到底是什么区别?20个问题告诉你答案

摘要:NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。本文分享自华为云社区,原...

JAVA高级架构 484

Sony微单相机alpha6000 wifi远程控制(1)

引言 Sony’s Camera Remote API beta SDK allows you to control a number of Sony cameras, including Sony Action cams, Sony Alpha cameras and Lens Style cameras, wirelessly from another device. 索尼于2017年三月Re...

markfuk996的博客 4965

Java NIO:IO与NIO的区别

Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。此外,它不能前后移动流中的数据。io的各种流是阻塞的,就是当一个线程调用读写方法时,该线程会被阻塞,直到读写完,在这期间该线程不能干其他事,CPU转而去处理其他线程,假如一个线程监听一个端口,一天只会有几次请求进来,但是CPU却不得不为该线程不断的做上下文切换,并且大部分切换以阻塞告终。

m0_38041697的博客 524

STM32 RT-Thread 系统分析(1)- 启动文件

RT-Thread STM32 系统分析(1)- 启动文件前言基本信息前言说明三级目录 前言 基本信息 名称 描述说明 RT-Thread Studio 软件版本 版本: 1.1.3 RT-Thread 系统版本 4.0.2 STM32CubeIDE 软件版本 1.4.0 STM32芯片型号 STM32F013VG 前言说明 使用了STM32CubeIDE 和 RT-Thread Studio 建立了相同型号芯片的工程,对比其中启动文件内容差异如下: 左侧是RT-Threa

鸳鸯冰笔的博客 4096

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

「汽车电子助手」的博客 696

java-Io与NIO的区别

通过FileChannel,我们可以实现对文件的读取和写入操作,也可以使用它的position()方法来控制读写位置,并配合Buffer进行数据操作。在这个例子中,我们创建了一个Selector对象,并通过ServerSocketChannel的register()方法将其注册到Selector上,监听其连接请求的就绪状态。当有新的客户端连接请求到达时,我们调用accept()方法来接受它,并将其SocketChannel对象注册到Selector上,监听其读取数据的就绪状态。

weixin_38355933的博客 750

245. 项目195:简易文字冒险游戏——《跟老吕学Python·新手》

如果您在学习本专栏教程时遇到任何问题,或有任何技术交流的意愿,欢迎在文章评论区留言,或通过优快云私信与老吕取得联系。老吕将及时回复您的留言,并与您共同探讨,以期为大家提供更为精准和有效的帮助。老吕珍视每一位读者的反馈和支持,期待与您共同学习、共同进步,共同创造美好的未来!我们的目标是不仅教会您Python语言,更是培养您解决问题的思维方式。请随意翻阅,按照自己的节奏学习,让这本专栏成为您编程旅程中的可靠伙伴。开发一个简易的文字冒险游戏,通过文本描述场景和事件,让玩家通过选择不同的选项来推动故事发展。

Python老吕的博客 712

java中的I/O与NIO区别

                                          java中的I/O与NIO区别 一、I/O于NIO的基本概念: I/O即普通I/O,是我们比较常用的一种形式,I/O又称阻塞IO。在默认情况下,文件操作都是阻塞IO。 当线程需要读取文件的时候,发现文件没有准备好,就会进入阻塞状态。数据准备好了之后,就会唤醒该线程,线程进 入等待状态,等待执行。轮到该进程执...

0bug0warning的博客 1243

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 439

4-20mA电流信号转电压

该电路实现4-20mA电流信号转电压(0.44-2.2V)调理功能,采用两级运放设计:第一级LMH6642MFX进行11倍放大,第二级配置为缓冲器加二阶低通滤波。电路包含10Ω采样电阻、多级RC滤波和ESD防护,具有抗干扰强、功耗低(4mW)等特点,适配3.3V系统ADC采集。通过使能控制MOS管可实现节能模式,适用于工业自动化、环境监测等场景。设计合理平衡了信号精度与功耗,输出电压范围留有充足余量避免饱和。

qq_37999850的博客 303

Java 中 NIO 和IO 的区别

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

weixin_44979389的博客 965

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3636

Java IO 和 NIO的区别

主要区别 IO NIO 面向字节流 面向缓冲区 阻塞 基于Selector的非阻塞 Java IO 和 NIO的主要区别体现在以上两个方面,以下详细说明这些区别的具体含义。面向流和面向缓冲区这个概念和编程方法中的面向过程、面向对象类似。Java IO 是面向流的而Java NIO是面向缓冲区的。在Java IO中读取数据和写入数据是面向流(Stream)的,这表示当我们从流中读

riskLoveHe的博客 8764

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java nio和io区别_Java NIO和IO的区别

IO NIO面向流 面向缓冲阻塞IO 非阻塞IO无 选择器面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需...

weixin_33905037的博客 241

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中IO和NIO的本质和区别

终于要写到java中最最让人激动的部分了IO和NIO。IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就存在的。NIO叫做new IO,是在java1.4中引入的新一代IO。 IO的本质是什么呢?它和NIO有什么区别呢?我们该怎么学习IO和NIO呢? 别急,看完这篇文章一切都有答案。

程序那些事 9545

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java传统的io和nio区别_Java中IO和NIO的本质和区别

简介终于要写到java中最最让人激动的部分了IO和NIO。IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就存在的。NIO叫做new IO,是在java1.4中引入的新一代IO。IO的本质是什么呢?它和NIO有什么区别呢?我们该怎么学习IO和NIO呢?别急,看完这篇文章一切都有答案。IO的本质IO的作用就是从...

weixin_34243541的博客 375

Java之IO NIO AIO 的区别

Java之IO NIO AIO 的区别 IO 同步阻塞 每个请求开启一个线程 线程开启,如果当前线程没有数据可读,线程阻塞在read IO流简单来说就是input和output流,IO流主要是用来处理设备之间的数据传输,Java IO对于数据的操作都是通过流实现的,而java用于操作流的对象都在IO包中。 按操作数据分为:字节流(InputStream、OutputStream)和字符流(Reader、Writer) 按流向分:输入流(Reader、InputStream)和输出流(Writer、Out

不知名摸鱼开发 507

java nio与io 区别和比较_Java NIO与IO的区别和比较

传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力。小量的线程如何同时...

weixin_42403922的博客 257

java io和nio的区别_IO与NIO的区别

一、概念NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。二、NIO和IO的主要区别下表总结了Java IO和NIO之间的主要区别:IONIO面向流面向缓冲阻塞IO非阻塞IO无选择器1、面向流与面向...

weixin_36282765的博客 219
上一篇: JavaNIO之Pipe
下一篇: NIO之Path
菜鸟=大神
博客等级 码龄11年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值