博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
备受面试官青睐的 Java NIO,到底和传统 IO 有啥不一样
阅读量:4069 次
发布时间:2019-05-25

本文共 916 字,大约阅读时间需要 3 分钟。

Java NIO自从JDK1.4引入以来,就备受青睐,不但开发者重视,面试官也重视起来。那么 Java NIO 到底和传统 IO 有啥不同呢,我们来理一理。

备受面试官青睐的 Java NIO,到底和传统 IO 有啥不一样

 

一、NIO和IO的不同

从图中对比中我们可以看到NIO的三个主要特点:面向缓冲、同步非阻塞和多路复用。

备受面试官青睐的 Java NIO,到底和传统 IO 有啥不一样

 

要理解这几个特点,我们需要知道NIO的三大核心组件:通道(Channel)、缓冲(Buffer)、选择器(Selector)。

1、面向缓冲

传统IO是面向流的,NIO是面向缓冲的。传统IO是每次从流中读一个或多个字节,直到读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。NIO是将数据读取到一个她稍后处理的缓冲区,需要时可在缓冲区中前后移动,增加了处理过程中的灵活性。

2、同步非阻塞

传统IO的流是阻塞的,当一个线程调用read() 或 write()时,该线程被阻塞,直到数据完成读取或写入完成,此期间该线程不能再干任何事情了。NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。

3、多路复用

多路复用是指使用单线程也可以通过轮询监控的方式实现多线程类似的效果。简单的说就是,通过选择机制,使用一个单独的线程很容易来管理多个通道。

二、通道(Channel)

Channel是传统IO中的Stream(流)的升级版,Stream是单向的、读写分离,Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。

Channel和Buffer的关系可以用下图来表示,

备受面试官青睐的 Java NIO,到底和传统 IO 有啥不一样

 

三、缓冲(Buffer)

Buffer可以理解为一块内存区域,可以写入数据,并且在之后读取它。这块内存被包装成NIO buffer对象,它提供了一些方法来更简单地操作内存。

四、选择器(Selector)

备受面试官青睐的 Java NIO,到底和传统 IO 有啥不一样

 

选择器(Selector)可以实现一个单独的线程来监控多个注册在她上面的信道(Channel),通过一定的选择机制,实现多路复用的效果。

以上Java NIO和IO的不同,你都清楚了吗?

转载地址:http://ohoji.baihongyu.com/

你可能感兴趣的文章
OS + UNIX AIX command
查看>>
OS + UNIX AIX performance
查看>>
OS + UNIX AIX Tools
查看>>
my ReadBook_liutongjingjixue / circulation economics
查看>>
my ReadBook_wangluoyingxiaoyucehua / network marketing / wangluoyingxiao
查看>>
db base database
查看>>
Spring2.5+MINA2搭建Socket Server
查看>>
jcharts画线图,饼图和柱状图
查看>>
监控服务器端口,Down掉会自动重启,并发送邮件 Linux Shell
查看>>
Git提交错误:RPC failed; result=22, HTTP code = 411
查看>>
Druid使用ConfigFilter
查看>>
Elicpse使用技巧-打开选中文件文件夹或者包的当前目录
查看>>
eclips 运行项目内存不足的解决方案
查看>>
linux 挂载盘阵 smb
查看>>
漫谈 JAVA程序员、架构师、项目经理
查看>>
ceph (luminous 版) crushmap 与 pool结合用于物理划分 IO 使用域
查看>>
mysql 相关索引
查看>>
tomcat7 - cacti 备忘
查看>>
kubernetes 上部署 kubevirt 运行虚拟机
查看>>
kubevirt 对 VMI 调用 CEPH 作为云盘方法
查看>>