在Java1.4之前的版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临以下几个问题:

1、没有数据缓存区,I/O性能存在问题

2、没有C/C++通道的概念,输入和输出流是相互独立的不能复用

3、同步阻塞式I/O通信(BIO),造成线程资源被长时间阻塞(致命缺陷)

4、硬件可移植性差,支持的字符集编码有限

根据UNIX网络编程的概念,I/O模型有五种

详情请查看这篇文章

UNIX五种网络I/O模型

在没有JavaNIO之前呢,基于Java的所有的所有的Socket通信都采用了同步阻塞式模型(BIO)这种请求<->应答的通信模式降低了开发难度,但是在性能和可靠性方面存在巨大缺陷,因此大型应用服务器都是C/C++语言开发,因为他们可以直接操作系统提供的异步的I/O或者是AIO能力。当并发访问量增大,响应时间延迟增大之后,采用JavaBIO开发的服务器只能通过硬件扩容来满足高并发和低延时,极大增加了企业成本。

正是由于JavaBIO的不足,Java1.4版本之后提供了新的NIO库,支持非阻塞式I/O操作。

JavaNIO提供了很多的异步I/O开发和API类库,主要的类和接口如下:

进行异步I/O操作的缓存区ByteBuffer

进行异步I/O操作的管道Pipe

进行各种I/O操作(异步或者同步)的Channel,包括ServerSocketChannel和SocketChannel

多种字符集编码能力和解码能力

实现非阻塞I/O操作的选择器Selector

基于流行Perl实现的正则表达式库

了解NIO必须先了解几个概念

什么是同步
什么是异步
什么是阻塞
什么是非阻塞
什么是同步阻塞
什么是同步非阻塞
什么是异步阻塞
什么是异步非阻塞

技术语言解释:

同步:当一个进程去访问另一个进程时,必须得到一个结果(指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪)

异步:当一个进行访问另一个进程时时,不用立刻给结果,我会告诉你一个信息,你把结果放在这里,通知我即可(异步I/O就是Java将I/O读写操作委托给操作系统,告诉操作系统将数据放到哪个缓存区,数据大小)

阻塞:当一个进程去操作某个资源时发现这个资源不在或者暂时不可操作,那么这个进程就一直等,等可以操作

非阻塞:当进程发现没有资源可操作的时候立刻返回读写函数,而不会等待

生活中的例子:

同步:比如电话好友,那么无论打通还是打不通,都会得到回应,(用户接通了,用户正在通话,用户已关机等信息)

异步:比如叫餐,我们APP下单之后就可以做其他的事情,你只需要告诉地址,电话,食物到了送餐员会打电话通知你

阻塞:比如收费站堵车,这个就最能代表阻塞,你只能等着啥干不了

非阻塞:比如到银行排队办理业务,那么我们会拿一张排号小票,就可以去做其他事情,到号就会叫你!

网上有一个例子

同步阻塞:到饭店吃饭点餐,在那里等着不停的问,菜好了吗?菜好了吗?

同步非阻塞:点完餐,直接去打球,不过你需要隔一段时间来问一次,菜好了吗?

异步阻塞:菜做好饭店打电话给你让你亲自去拿。

异步非阻塞:菜做好,饭店直接送到球场

所以我们归纳:

同步和异步是针对应用程序和内核的交互而言的,

1、同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,

2、异步是指用户进程触发I/O操作以后便开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。

阻塞和非阻塞是针对于进程在访问数据的时候,根据I/O操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,

1、阻塞方式下读取或者写入函数将一直等待

2、而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

所以,I/O操作可以分为3类:同步阻塞(即早期的I/O操作)、同步非阻塞(NIO)、异步(AIO)。

BIO

在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝。即:一个连接,要求Server对应一个处理线程。

NIO

在Java里的由来,在JDK1.4及以后版本中提供了一套API来专门操作非阻塞I/O,我们可以在java.nio包及其子包中找到相关的类和接口。由于这套API是JDK新提供的I/O API,因此,也叫New I/O,这就是包名nio的由来。这套API由三个主要的部分组成:缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成。在理解NIO的时候,需要区分,说的是New I/O还是非阻塞IO,New I/O是Java的包,NIO是非阻塞IO概念。这里讲的是后面一种。

NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。

NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。
也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

AIO

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。
在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:

AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。

转载于:https://www.cnblogs.com/gyjx2016/p/7219983.html

【NIO】之IO和NIO的区别相关推荐

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

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

  2. NIO 和 IO 到底有什么区别?别说你不会!

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...

  3. Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  4. Java与汽车_Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  5. 详解Java NIO,IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  6. java io nio aio_Java IO、NIO、AIO知识总结

    本文主要讲述下自己对IO的理解,对IO的用法和细则可能没有顾虑到. 本文的理解基于以下几篇文章,他们对各自部分都讲的很细,对我理解IO提供了很大帮助. 该文主要讲解了Java IO的类体系以及他们各自 ...

  7. 史上讲的最好的Java NIO与IO的区别与应用

    如果下面的内容看的不太懂,直接看最后的摘要和总结. 在研究Java NIO和IO API时,很快就会发现一个问题: 我什么时候应该使用IO,什么时候应该使用NIO? 在本文中,我将尝试阐明Java N ...

  8. Java NIO与IO的区别和比较

    Java NIO与IO的区别和比较 导读 J2SE1.4以上版本中发布了全新的I/O类库.本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO ...

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

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  10. Java中IO和NIO的本质和区别

    文章目录 简介 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序 ...

最新文章

  1. 一种用于360度全景视频超分的单帧多帧联合网络
  2. JAVA NIO之Direct Buffer 与 Heap Buffer的区别?
  3. 垂直梯形校正画质损失多少_投影仪梯形校正会影响画质吗?投影仪梯形校正调不正怎么办?...
  4. 黑鱼资源网完整版织梦整站源码打包分享
  5. 【资源下载】DeepMindUCL深度学习与强化学习进阶课程
  6. wordpress php 链接,简介WordPress中用于获取首页和站点链接的PHP函数_PHP
  7. FlashMX2004组件事件简单调试器
  8. xx闪购—搜索框和iconfont
  9. 小白学习meshlab(1)——基本的edit工具学习
  10. 漏洞复现-——通达OA任意用户登陆漏洞
  11. 超级记忆/图像数字记忆 110位数字图像转换表 61-70
  12. 面向对象(OOP)概念理解,通俗易懂
  13. english_搭配
  14. keep-alive的作用是什么? 使用它的目的是什么?
  15. php如何截取出视频中的指定帧作为图片
  16. 域控服务器的dns配置,如何配置额外域控制器上的DNS?
  17. MD5骨骼动画模型加载
  18. 游戏美术次世代制作流程图文详解
  19. 银行卡编码规则及检验算法详解
  20. 机器人涂装工程师岗位英文缩写_公司职位及英文缩写大全

热门文章

  1. day19 复习,组合和继承
  2. 【EMV L2】SDA静态数据认证处理流程
  3. jboss数据源配置
  4. background-clip与background-origin
  5. javascript arguments
  6. [转]在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录...
  7. fixed 语句(C# 参考)
  8. 会计电算化算不算计算机专业,成都会计学校会计电算化专业介绍
  9. Java Spring IOC用法
  10. c语言中变量的值十进制,C语言中介绍的整型变量 即十进制 十六进制什么的是什么意思 能具体解释一下吗 还有换算什么的 谢谢...