为了账号安全,请及时绑定邮箱和手机立即绑定

Java NIO与IO的详细区别(可不可以深入到JVM和操作系统来讲解)

Java NIO与IO的详细区别(可不可以深入到JVM和操作系统来讲解)

狐的传说 2019-03-13 14:14:48
补充:查阅网上相关资料都说,NIO是和操作系统底层相关的,这就一句话,不得其解;还有NIO的Selector的那个工作模式它是怎么实现的呢? 
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

内核空间用户空间计算机体系结构计算机组成原理、…… 确实有点儿深奥。

我的新书《代码之谜》会有专门的章节讲解相关知识,现在写个简短的科普文:

就速度来说 CPU > 内存 > 硬盘

  • I- 就是从硬盘到内存

  • O- 就是从内存到硬盘

第一种方式:我从硬盘读取数据,然后程序一直等,数据读完后,继续操作。这种方式是最简单的,叫阻塞IO

第二种方式:我从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程序(对硬件来说叫中断,对程序来说叫回调),然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

在一起的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。

还有一种就是同步 IO 和异步 IO。经常说的一个术语就是“异步非阻塞”,好象异步和非阻塞是同一回事,这大概是一个误区吧。

至于 Java NIO 的 Selector,在旧的 Java IO 系统中,是基于 Stream 的,即“流”,流式 IO。

当程序从硬盘往内存读取数据的时候,操作系统使用了 2 个“小伎俩”来提高性能,那就是预读,如果我读取了第一扇区的第三磁道的内容,那么你很有可能也会使用第二磁道和第四磁道的内容,所以操作系统会把附近磁道的内容提前读取出来,放在内存中,即缓存

(PS:以上过程简化了)

通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。


查看完整回答
反对 回复 2019-04-15
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

nio 少了一次从 内核空间 到 用户空间的 copy.


查看完整回答
反对 回复 2019-04-15
  • 2 回答
  • 0 关注
  • 766 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号