什么是NIO?
java.nio全称java non-blocking IO(实际上是 new io),是指JDK 1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。
NIO三大核心组件
选择器 Selector
Selector 是 Java NIO 的一个组件,它用于监听多个 Channel 的各种状态,用于管理多个 Channel。
通道 Channel
Channel是一个对象,可以通过它读取和写入数据。可以把它看做IO中的流。但是它和流相比还有一些不同:
Channel是双向的,既可以读又可以写,而流是单向的.
Channel可以进行异步的读写.
对Channel的读写必须通过buffer对象.
在Java NIO中Channel主要有如下几种类型:
FileChannel:从文件读取数据的
DatagramChannel:读写UDP网络协议数据
SocketChannel:读写TCP网络协议数据
ServerSocketChannel:可以监听TCP连接
缓存区 Buffer
Buffer 是所有具体缓存区的基类,是一个抽象类,它的实现类有很多,包含各种类型数据的缓存。
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
MappedByteBuffer
Buffer 中有几个重要的成员属性
private int mark = -1; // 标记
private int position = 0; //位置,下一个要被读取或写的元素的索引,每次读写缓冲区数据时都会改变该值,为下次读写作准备
private int limit; //表示缓冲区当前的终点,不能对缓冲区超过极限的位置进行读写操作,且极限是可以修改的
private int capacity; //容量,及可以容纳的最大数据量,在缓冲区创建时被设定并且不能被修改
long address;
NIO组件之间的关系:
1.Selector选择器对应一个线程,一个线程对应多个Channel(连接)
2.每一个Channel都对应一个buffer
3.Buffer就是一个内存块,底层是一个数组
4.程序切换到哪一个Channel是由事件决定的,Event就是一个重要的概念/
5.Selector会根据不同的事件,在各个通道上切换.
6.数据的读取写入是是通过Buffer,通过flip方法进行切换实现双向操作,这与BIO有本质不同的,BIO是通过单向流input输入流或output输出流直接写入到通道中
7.Channel也是双向的
常用API