1,概述
-java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO)
-nio和io作用是一样的,但是使用方式有很大区别
-nio面向缓冲区,基于通道的io操作,效率更高,非阻塞式,有选择器
-io面向流,阻塞式
2,阻塞式和非阻塞式
io的各种流是阻塞的,就是当一个线程调用读写方法时,该线程会被阻塞,
直到读写完,在这期间该线程不能干其他事,CPU转而去处理其他线程,
假如一个线程监听一个端口,一天只会有几次请求进来,
但是CPU却不得不为该线程不断的做上下文切换,并且大部分切换以阻塞告终。
NIO通讯是将整个任务切换成许多小任务,
由一个线程负责处理所有io事件,并负责分发。
它是利用事件驱动机制,而不是监听机制,事件到的时候再触发,
NIO线程之间通过wait,notify等方式通讯。
保证了每次上下文切换都有意义,减少无谓的进程切换。
3,java nio和核心在于:通道Channel 缓冲区 Buffer
-通道:表示的是2端的一个链接。(表示打开到io设备的链接)
-缓冲区:用于存取数据的容器
-简单的说,channel负责传输 buffer负责存取
4,缓冲区 Buffer
-用于特定原始类型的数据的容器。 是一个抽象类
所有具体的缓冲区都是该类的子类
和通道进行交互,数据从通道读进缓冲区,从缓冲区写入通道的
-方法:
int capacity()
返回此缓冲区的容量。
Buffer clear()
清除此缓冲区。
Buffer flip()
翻转这个缓冲区。
int limit()
返回此缓冲区的限制。
Buffer mark()
将此缓冲区的标记设置在其位置。
int position()
返回此缓冲区的位置。
Buffer reset()
将此缓冲区的位置重置为先前标记的位置。
Buffer rewind()
倒带这个缓冲区。
/* * 这些缓冲区的使用方式基本一致,获取方式都一样 * static ByteBuffer allocate(int capacity) 分配一个新的字节缓冲区。 缓冲区中有2个最主要的方法: * get() 获取缓冲区中数据 * put() 给缓冲区中存数据 * 缓冲区中的核心属性: * capacity 容量,表示缓冲区最大存储的数据个数,一旦声明不能改变 * limit 界限,表示缓冲区中可以操作的数据的大小,limit后不能进行读写 * position 位置,表示当前在缓冲区中正在操作的数据的位置 * mark 标记,记录当前position的位置,使用reset方法可以回到mark位置 * */
Demo
Result code