1. 简介

NIO即New IO,JDK1.4中引入的。提供了与标准IO不同的IO工作方式,可替代 标准Java IO 的IO API。

  • Java IO是面向流的,这意味着我们需要每次从流中读取一个或多个字节,直到读取完所有字节;NIO是面向缓冲的,也就是说会把数据读取到一个缓冲区中,然后对缓冲区中的数据进行相应处理。
  • Java IO是阻塞IO,而NIO是非阻塞IO。
    阻塞IO:当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间不能再干任何事情了
    非阻塞IO:一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情
    -Java NIO中存在一个称为选择器(selector)的东西,它允许你把多个通道(channel)注册到一个选择器上,然后使用一个线程来监视这些通道:若这些通道里有某个准备好可以开始进行读或写操作了,则开始对相应的通道进行读写。而在等待某通道变为可读/写期间,请求对通道进行读写操作的线程可以去干别的事情。

2. NIO核心组件

  • 通道(Channel)
  • 缓冲区(Buffer)
  • 选择器(Selectors)

基本上,所有的IO和NIO都从一个Channel开始。Channel有点像流。数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中

以下是Java NIO里关键的Buffer实现
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
这些Buffer覆盖了你能通过IO发送的基本数据类型:byte,short,int,long,float,double和char

Java NIO还有个MappedByteBuffer,用于表示内存映射文件。

Selector

Selector允许单线程处理多个Channel。如果你的应用打开了多个连接(通道),但每一个连接的流量都很低,使用Selector就会很方便。

这是在一个单线程中使用一个Selector处理3个Channel的图示:

要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接送等

Channel:
Java NIO的通道类似流,但又有些不同:

既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
通道可以异步的读写。
通道的数据总是要先读到一个Buffer,或者总要从一个Buffer中写入。
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。

Java——NIO和IO的区别相关推荐

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

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

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

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

  3. java.io和util的区别_Java NIO与IO的区别和比较

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

  4. Java NIO与IO比较总结

    在学习标准IO相关接口和NIO接口时,我们常常面临一个问题:什么时候应该使用IO接口?什么时候应该使用NIO接口? 这里我们将对比较Java NIO 和 IO的区别,他们的使用场景,如何使用他们编写高 ...

  5. Java NIO (十四)NIO 和 IO 的区别和适用场景分析

    在研究Java NIO和IO API时,很快就会想到一个问题: 什么时候应该使用IO,什么时候应该使用NIO? 在本文中,我将尝试阐明Java NIO和IO之间的区别,它们的用例以及它们如何影响代码的 ...

  6. java nio与io_Java NIO和IO的区别(转)

    下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. 复制代码代码如下: IO                NIO 面向流            面向缓冲 阻塞IO   ...

  7. 理解NIO和IO的区别和应用场景,这一篇就够了

    Java中的NIO和IO的区别 IO IO(Input/Output)是Java中用于处理输入输出的标准库.在IO中,数据的读取和写入都是通过字节流(InputStream/OutputStream) ...

  8. Java NIO系列教程(十二) Java NIO与IO

    原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java ...

  9. Java NIO和IO的主要区别

    2019独角兽企业重金招聘Python工程师标准>>> Java NIO和IO的主要区别如下: 1.NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义 ...

  10. mysql io nio区别_Java NIO和IO的区别

    Java NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用 的方式完 ...

最新文章

  1. 使用 IDEA 开发工具(版本为 IntelliJ IDEA 14.1.4)打可执行jar包的操作步骤
  2. scala 主构造函数_在Scala中,如何在类的主构造函数中定义局部参数?
  3. java调用jndi出错,无法使用Java JNDI上下文查找来访问对象
  4. [转]细说Redis监控和告警
  5. 【符号修改】之修改静态库内部的符号
  6. 要不要借钱给好朋友?救急不救贫
  7. Maven settings.xml
  8. python之函数用法__getitem__()
  9. 老虎ji 剪枝模拟
  10. Object类的使用
  11. java日期字符串排序_Java 8 字符串日期排序
  12. win11登录网站出现登录失败,请使用IE内核浏览器解决办法
  13. 华为S2000-HI交换机与cisco的acs结合做认证
  14. Python描述 LeetCode 13.罗马数字转整数
  15. 智能智慧型停车场管理系统解决方案
  16. 2022年虚拟电厂行业研究报
  17. 前端学习记录005_canvas绘制钟表
  18. 贝叶斯分类、极大似然估计和最大后验概率估计的一些概念
  19. 将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大
  20. 博弈论 (入门)CSU2209 记忆化搜索

热门文章

  1. 小程序 实现语音播放功能
  2. cmd命令窗口快捷键与小技巧
  3. g729源码分析-开篇
  4. OpenNESS NTS 的前世今生
  5. metro3000 OSN2500 OSN3500 华为传输 华为光端机
  6. 根据经纬度获取地理位置 和 根据地址获取经纬度
  7. 北京航空航天大学计算机考研资料汇总
  8. FPGA实现对数log2和10*log10
  9. 刷脸支付帮助店铺构建细致准确的用户画像
  10. 【吉大刘大有数据结构绿皮书】例3.16:已知非空线性链表第一个结点的指针为list,写一算法,删除线性链表中的第i个结点。