NIO学习(一):基本概念

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/outsanding/article/details/102649662
背景
  1. Java IO 和 NIO 相关知识都是研究内核空间和用户空间(应用程序)之间的相互关系:

    从内核空间拷贝到用户空间?涉及到零拷贝知识

    用户空间等待内核空间准备数据?阻塞知识

    用户空间不等待内核空间准备数据?非阻塞知识

    用户空间去主动去内核空间读数据?同步知识

    内核空间准备好数据回调给用户空间?异步知识


基本概念
  1. 阻塞IO(BIO,Blocking Input Output),JDK1.4以前
    定义:A调用B,A一直等待B的返回,然后什么事也不做。

    Java IO具体过程:应用程序等待内核空间准备数据,一直等到数据准备好,其他什么事情也不做。

  2. 非阻塞(NIO, Non-Blocking Input Output),JDK1.4到JDK1.6
    定义:A调用B,A不等待B的返回,转而去做其他事情。

    Java NIO具体过程:应用程序不等待内核空间准备数据。

  3. 同步(synchronize)
    广义上定义:A调用B,A等待B的返回,然后什么事也不做。

    具体过程:用户空间去主动去内核空间读数据。

  4. 异步(AIO, asynchronize Input Output),JDK1.7及其以后
    广义上定义:A调用B,A不等待B的返回,转而去做其他事情。

    Java AIO具体过程:内核空间准备好数据回调给用户空间。

Java IO 是阻塞IO

是面向编程的,而且这个流 要么是输入流,要么是输出流, 只能是其中一个,不能同时既是输入流又是输出流。

Java NIO 非阻塞IO
  1. 三个核心组件
    Selector
    Channel
    Buffer

  2. 是面向 块(block) 编程或者说面向 缓冲区(buffer) 编程。

  3. Selector
    可选择Channel(SelectableChannel)对象的多路复用选择器多路是指可以多个Channel同时注册到Selector上。复用指的是这个Selector其实就是单线程的。选择器的概念来源是原来操作系统有个阻塞方法叫select,而现在操作系统的使用epoll方法,引申过来就使用了一个名称:选择器。然后根据它的特性,于是定义为多路复用选择器

  4. Channel
    Channel可以理解为java.io中的stream,这么理解是没有任何问题的。数据最开始是通过Channel写到Buffer中的,通过Buffer到我们的程序中的,不会直接从Channel到我们的应用程序。

  5. Buffer

    Buffer本身就是一块内存,底层实现上其实就是数组,读和写都是通过Buffer来实现的。
    Buffer 它自身能够进行读和写,调用flip方法即可:Buffer.flip()重新给Buffer的属性position、limit赋值。在进行读和写转换的时候,一定要显示调用一下flip方法。


小结
  1. 从Java底层对IO操作的过程来理解:阻塞和非阻塞,同步和异步概念
  2. 理解Java IO和Java NIO定义是什么。
  3. Java IO底层:阻塞与非阻塞研究的是系统空间和外界输入与输出的关系;而同步与异步研究的是系统空间和用户空间关系。

猜你喜欢

转载自blog.csdn.net/outsanding/article/details/102649662
今日推荐