NIO即non-blocking I/O(非阻塞式IO)。指的是应用程序在调用NIO完成某个操作时,内核立即返回,不会将CPU时间切换给其他进程,应用程序在返回后,可以得到足够的CPU时间继续完成其他的事情。
与之相对的是阻塞式IO,当应用程序调用阻塞式IO完成某个操作时,应用程序会被挂起,等待内核完成操作。
下面介绍NIO的三大组件:
1、channel
channel是数据传输通道。同样是数据传输,NIO中的channel和IO中的Stream的区别如下:
- Stream是单向的,即我们用Stream去读写数据的时候,读写是分离的,必须指定用的是InputStream还是OutputStream;而channel则不同,它是双向的,可读可写;
- Stream是阻塞式的,而channel可以异步读写;
- Stream中的数据,可以选择先读入到缓存中去(BufferInputStream/BufferOutputStream),而channel则必须通过缓存才能读写。
2、Buffer
前面说到channel必须通过缓存才能读写数据,这里的缓存即内存缓冲区(Buffer),目的是暂存从channel中读入的数据或者向channel中写入的数据。其内部实现为一个在内存中的字节数组:
public abstract class Buffer {
// Invariants: mark <= position <= limit <= capacity
// 标记的位置
private int mark = -1;
// 当前指针位置
private int position = 0;
// 限制位置
private int limit;
// 容量
private int capacity;
long address;
}

具体的读写数据的原理在后面ByteBuffer时再进行详细说明。
3、selector
selector是一个选择器,配合一个线程去管理多个channel,它通过获取channel上发生的事件,不让线程吊死在同一个channel上。

Comments NOTHING