缓冲区Buffer
Buffer是一个对象,该类是个抽象类,主要包含一些要写入或者要读出的数据。在INO类库中加入Buffer对象,体现了新库与原来的I/O的区别。
在NIO库中,所有的数据都是用缓冲区处理的。在读取数据时,它是直接读取到缓冲区中的,在写入数据时,写入到缓冲区中。任何时候该访问NIO中的数据,都是通过缓冲区进行操作。
缓冲区实质上是一个数组,通常是一个byteBuffer。一个缓冲区不仅仅是一个数组,缓冲区还提供了对数据的结构化访问以及维护读写位置等信息。
通道Channel
channel是一个通道,网络数据通过channel进行读写。通道和流的不同之处在于通道是双向的,流只是在一个方向上移动,而通道可以用于读写或者二者的同时进行。
channel是全双工的,所以它可以比流更好的映射底层操作系统的API.
主要分为两大类:
用于网络读写的selectablechannel
用于文件操作的filechannel
serversocketchannel和socketchannel都是selectablechannel的子类
多路复用器selector
它是Java NIO编程的基础。
selector会不断地轮询注册在其上的channel,如果某个channel上发生了读或者写的事件,这个channel就处于就绪状态,会被selector轮询出来,然后通过selectionkey可以获取就绪channel的集合,在进行后续的I/O操作。
一个多路复用器selector可以同时轮询多个channel,由于jdk使用;了epoll()代替传统的select实现,所以它并没有限制最大链接句柄。一个线程负责selector的轮询,就可以介入成千上万的客户端。