1、nio类库介绍
nio在jdk1.4以后引入的,
1.1缓存区buffer
buffer是一个对象,包含一些要写入或者读出的数据,在nio类库中加入buffer对象,体现新库与原IO的一个重要区别,在面向流io中,可以将数据直接写入或将数据直接读到sream对象中。
缓存区实质是一个数组,通常它有一个字节数组(bytebuffer),也可以使用其他数组,但是一个缓存区不仅仅是一个数组,还提供了数据结构化访问以及维护读写位置(limit)等信息
最常见的缓存区是Bytebuffer,字节缓冲区
charbuffer 字符缓冲区
shortbuffer 短整形缓冲区
lntbuffer 整形缓冲区
longbuffer 长整形缓冲区
floatbuffer 浮点型缓冲区
doublebuffer 双精度浮点缓冲区
每个buffer类都是buffer接口的一个子实例,除了bytebuffer,每一个buffer类都有完全一样的操作,如下
capacity ,limit mark,position,clear,flip。
2、通道channel
channel是一个通道,和自来水管一样,里面的水就是buffer,通道是双向的,可以读,可以写,也可以同时进行
channel主要分为两大类:selectableChannel(网络读写)和filechannel(文件读写)
3、多路复用器selector
Selector会不断的轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合进行后续的IO操作。
一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替传统的select实现,所以它并没有最大连接句柄1024/2048的限制。这也就意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端,