1. NIO
NIO
为非阻塞I/O(Non-block I/O)
与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel
和ServerSocketChannel
两种不同的套接字通道实现,均支持阻塞和非阻塞两种模式。
对于高负载、高并发的网络应用,需要使用NIO的非阻塞模式进行开发。
2. NIO类库
2.1 缓冲区Buffer
在面向流的I/O中,可以将数据直接写入或者将数据直接读出到Stream对象中。
缓冲区实质上是一个数组,最常用的字节数组(ByteBuffer)。缓冲区提供了对数据的结构化访问以及维护读写位置(limit)的信息。
缓冲区包括:
- ButeBuffer: 字节缓冲区
- CharBuffer: 字符缓冲区
- ShortBuffer: 短整型缓冲区
- IntBuffer: 整型缓冲区
- LongBuffer: 长整型缓冲区
- FloatBuffer: 浮点型缓冲区
- DubleBuffer: 双精度浮点型缓冲区
2.2 通道Channel
Channel是一个通道,网络数据通过Channel读取和写入。通道和流不同之处在于通道是双向的,流是单向的。
因为Channel是全双工的,可以比流更好的映射底层操作系统的API。
Channel可以分为两大类:
- 用于网络读写的
SelectableChannel
- 用于文件操作的
FileChannel
SocketChannel
和ServerSocketChanne
l都是SelectableChannel
的子类。
2.3 多路复用器Selector
多路复用器Selector是Java NIO编程的基础,多路复用器提供选择已经就绪的任务的能力。
Selector会不断的轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。
一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替传统的select实现,所以它并没有最大连接句柄1024/2048 的限制。这意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。