背景
-
Java IO 和 NIO 相关知识都是研究内核空间和用户空间(应用程序)之间的相互关系:
从内核空间拷贝到用户空间?涉及到零拷贝知识。
用户空间等待内核空间准备数据?阻塞知识
用户空间不等待内核空间准备数据?非阻塞知识
用户空间去主动去内核空间读数据?同步知识
内核空间准备好数据回调给用户空间?异步知识
基本概念
-
阻塞IO(BIO,Blocking Input Output),JDK1.4以前。
定义:A调用B,A一直等待B的返回,然后什么事也不做。Java IO具体过程:应用程序等待内核空间准备数据,一直等到数据准备好,其他什么事情也不做。
-
非阻塞(NIO, Non-Blocking Input Output),JDK1.4到JDK1.6。
定义:A调用B,A不等待B的返回,转而去做其他事情。Java NIO具体过程:应用程序不等待内核空间准备数据。
-
同步(synchronize)
广义上定义:A调用B,A等待B的返回,然后什么事也不做。具体过程:用户空间去主动去内核空间读数据。
-
异步(AIO, asynchronize Input Output),JDK1.7及其以后。
广义上定义:A调用B,A不等待B的返回,转而去做其他事情。Java AIO具体过程:内核空间准备好数据回调给用户空间。
Java IO 是阻塞IO
是面向流编程的,而且这个流 要么是输入流,要么是输出流, 只能是其中一个,不能同时既是输入流又是输出流。
Java NIO 非阻塞IO
-
三个核心组件
Selector
Channel
Buffer -
是面向 块(block) 编程或者说面向 缓冲区(buffer) 编程。
-
Selector
是可选择Channel(SelectableChannel)对象的多路复用选择器。多路是指可以多个Channel同时注册到Selector上。复用指的是这个Selector其实就是单线程的。选择器的概念来源是原来操作系统有个阻塞方法叫select,而现在操作系统的使用epoll方法,引申过来就使用了一个名称:选择器。然后根据它的特性,于是定义为多路复用选择器。 -
Channel
Channel可以理解为java.io中的stream,这么理解是没有任何问题的。数据最开始是通过Channel写到Buffer中的,通过Buffer到我们的程序中的,不会直接从Channel到我们的应用程序。 -
Buffer
Buffer本身就是一块内存,底层实现上其实就是数组,读和写都是通过Buffer来实现的。
Buffer 它自身能够进行读和写,调用flip方法即可:Buffer.flip()重新给Buffer的属性position、limit赋值。在进行读和写转换的时候,一定要显示调用一下flip方法。
小结
- 从Java底层对IO操作的过程来理解:阻塞和非阻塞,同步和异步概念。
- 理解Java IO和Java NIO定义是什么。
- Java IO底层:阻塞与非阻塞研究的是系统空间和外界输入与输出的关系;而同步与异步研究的是系统空间和用户空间关系。