1、缓冲区Buffer
Buffer是一个存储读入或写出的对象。在面向流的IO中,可以将数据写入Stream或读取Stream对象的数据。而NIO是面向Buffer,面向缓冲区的,数据的写入或读取操作都是在缓冲区中进行的。
Buffer的实质就是一个数组,但是比数组功能更强大,通常是一个ByteBuffer,也可以使用其他类型的数组。每一种基本类型都有对应的一种缓冲区(除了Boolean),比如CharBuffer、IntBuffer等等。
2、通道Channel
Channel是一个通道,就像自来水水管一样,数据通过Channel读取和写入。IO是通过流传输数据的,流只是在一个方向能够传输,比如InputStream只能输入、OutputStream只能输出。而NIO的Channel可在读写两个方向同时进行。很形象的一个例子,流传输就像两个人用对讲机对话,同一时间只能一个人讲话,而通道传输就像用手机对话,两个人同时都能说话。因为Channel是全双工的,也是为了更好的支持底层操作系统的API,操作系统的通道全是全双工的。
Channel可以分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel。
3、多路复用器Selector
多路复用器提供选择已经就绪的任务的能力。就是说,Selectort会不断轮询注册在其上的Channel,如果有某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的IO操作。
一个多路复用器Selector可以同时轮询多个Channel。也就是说,一个线程负责Selector的轮询,就可以同时接入成千上万的客户端。