`

Java NIO与IO的详细区别(通俗篇)

    博客分类:
  • Java
 
阅读更多

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

 

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

 

就速度来说 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 横空出世。

200
37
分享到:
评论
18 楼 lovme_forever 2014-01-08  
还有下篇继续跟进吗
17 楼 coolbamboo2008 2014-01-07  
写的很好,比喻很形象
16 楼 jiakechong 2014-01-07  
比喻很形象
15 楼 justjavac 2014-01-07  
在世界的中心呼喚愛 写道
楼主,你的意思是:块的方式从硬盘读取数据到缓存中,程序从缓存取数据是流的方式?

不是。「块」和「流」和方向无关,和实现有关。
14 楼 在世界的中心呼喚愛 2014-01-07  
楼主,你的意思是:块的方式从硬盘读取数据到缓存中,程序从缓存取数据是流的方式?
13 楼 sanshizi 2014-01-07  
I- 就是从硬盘到内存
O- 就是从内存到硬盘

改为: 从硬盘到内存是I 从内存到硬盘是O
12 楼 Tyrion 2014-01-06  
“按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。如何区分呢?首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。”
11 楼 lonelybug 2014-01-05  
NIO应用的是Reactor Design Pattern来作为实现的基本理念。

NIO还包括Direct Memory,和Zero-Copy。

总之,想学习的人还是自己看JDK文档吧。技术要的是严谨和深入浅出。

既然你写的题目是NIO和IO的详细区别,我觉得你还是需要改进一下你的文章。

10 楼 yidao620c 2014-01-04  
果然很详细
9 楼 zhouyicang 2014-01-03  
i/o通俗说应该是内存到外部存储吧,我感觉内存到网络也是io吧,不只是硬盘,个人不是很专业,只是有疑问,有错了指正哦
8 楼 shengren0 2014-01-03  
好详细啊!上首页了
7 楼 ie7shop 2014-01-03  
如些精妙详细的内容,让人叹为观止。。。
6 楼 somefuture 2014-01-03  
yixiandave 写道
为什么有种没写完的感觉。。。

明显没写完,太坑了。。
5 楼 yixiandave 2014-01-03  
为什么有种没写完的感觉。。。
4 楼 smallXiaoTi 2014-01-03  
    比喻好通俗。。
3 楼 msdn19880714 2014-01-02  
2 楼 y61759h 2014-01-02  
确实很详细
1 楼 rex0654335 2014-01-02  
果然很详细

相关推荐

    [ Java ] 最通俗易懂的 Java NIO 讲解

    文章目录IO 与 NIO 的比较通道和缓冲区缓冲区(buffer)通道(channel)使用 NIO 完成本地通信使用 NIO 完成网络通信管道 IO 与 NIO 的比较 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)...

    Java Netty技术研究

    远古: java.net + io java.net + iojava.net + java.iojava.net + java.iojava.net + java.iojava.net + java.iojava.net + java.io java.net + io java.net + io java.net + iojava.net + java.iojava.net + java....

    Java零基础学习视频通俗易懂

    10. **IO与NIO**:Java的IO流系统和非阻塞I/O(New IO,NIO)框架,包括通道(Channel)和缓冲区(Buffer)的概念。 11. **反射机制**:通过反射,程序在运行时可以获取类的信息(如类名、属性、方法等)并动态地...

    21天学通JAVA 更通俗意懂

    10. **IO和NIO**:JAVA的新IO(New IO)框架提供了一种更高效的数据传输方式,理解通道(Channel)和缓冲区(Buffer)的概念有助于编写高性能的IO程序。 11. **反射和注解**:JAVA的反射机制允许程序在运行时动态...

    通俗易懂的NIO教程(含配套资料)

    Java NIO 是 JDK 1.4 发布的一套全新的IO API(New IO 简称 NIO),由于 JDK 1.7 对 NIO 的更新,目前 NIO 被广泛应用,以至于将 JDK 1.7 的改动称为 NIO.2,NIO 可以替代传统的Java IO API。NIO与原来的IO有同样的...

    Java开发中名词的通俗解释共2页.pdf.zip

    这份名为“Java开发中名词的通俗解释共2页.pdf”的压缩文件,显然提供了一份简明扼要的Java编程术语解析,旨在帮助初学者或有经验的开发者更好地理解Java开发中的关键概念。虽然压缩包中似乎还有一个名为“赚钱项目...

    java入门与实例

    11. **文件和目录操作**:Java的`java.io`和`java.nio`包提供了丰富的API来处理文件和目录,如创建、删除、读写文件等。 12. **面向接口编程**:Java鼓励使用接口而非具体的实现,这样可以提高代码的灵活性和可扩展...

    韩顺平Java讲义94讲全

    6. **IO流与NIO**:讲解Java的输入输出流体系,包括字节流、字符流、缓冲流、对象序列化,以及新引入的非阻塞I/O(New IO,NIO)框架。 7. **网络编程**:Java提供了丰富的网络编程API,如Socket和ServerSocket,...

    JAVA 入门简易教材

    本教材是专为初学者设计的一份JAVA编程入门资料,以PDF格式呈现,旨在通过简洁明了的例子和通俗易懂的语言,帮助新手快速掌握JAVA编程基础。这份教程覆盖了JAVA语言的核心概念和常用技术,是您踏入JAVA世界的第一步...

    v3.0-JavaGuide面试突击版.pdf

    本资源摘要信息将为您提供一份详细的 Java 面试指南,涵盖了 Java 基础知识、集合框架、多线程、JVM、Java 面向对象编程、异常处理、IO 流、序列化和 Java 集合框架等方面的知识点。 一、Java 基础知识 1. Java 语...

    21天学通JAVA-en

    5. **IO流与NIO**:Java的输入/输出流系统,以及后来引入的新IO(NIO)机制,用于处理数据的读写,是进行文件操作和网络通信的重要部分。 6. **线程与并发**:Java提供了强大的多线程支持,学习线程的创建、同步和...

    java自学课件

    Java自学课件是一套全面而深入的教程,旨在引导初学者逐步掌握Java编程语言,从基础概念到高级特性,让学习者能够从零开始直至精通。这套课程的特点在于其教学方式的直观性和易理解性,它通过精确的语言阐述Java的...

    mini-course-app:此项目旨在帮助迷你课程管理

    Regusdevalidaçõesde enuda deusuáio; 乌干达情报资料; domidanédomínio; 西班牙语的通俗易懂的语言(无处不在的语言); 主修课程:学生,教授, MiniCourse ; Decisãodetransações,aquié...

Global site tag (gtag.js) - Google Analytics