和阻塞IO对应,
socket ————– socketChannel
serverSocket———-serverSocketChannel
这两种通道又支持阻塞和非阻塞两种实现模式。
阻塞模式代码简单,但是性能和可靠性不好。非阻塞模式相反。
基本概念
buffer
缓冲器buffer对象是NIO类库新加入的对象。他是非常重要的。
在以前面向流的IO中,输入输出是直接写到Stream中的。
在NIO里,所有数据的读写都是要通过缓冲区来的。
常用的缓冲区是ByteBuffer。实际上,每一种java基本类型都有对应的Buffer(boolean除外)。ByteBuffer常用是因为他最适合网络读写。
channel
通道。
和流的重要区别的,channel是双向的。
channel是全双工的。
channel主要非两大类:
- 用于网络读写的SelectableChannel
- 用于文件读写的FileChannel
selector
多路复用器。前面说过NIO的IO模型是用的多路复用IO。
selector是NIO编程的基础。非常重要。
selector会轮询注册其上的channel。如果某个channel有新的tcp连接,或者读写事件,那么这个channel就处于就绪状态,会被selector轮询出来。然后可通过selectionKey得到这个就绪的Channel,进行IO操作。
jdk使用epoll代替传统的select实现,因此它没有最大连接句柄1024/2048的限制,只需要一个线程负责selector轮询,就可以接入成千上万的连接。
时序图
代码示例: