文章目录
1.NIO概述
IO分为同步IO和异步IO。
BIO:同步阻塞IO
NIO:同步非阻塞IO
AIO:异步非阻塞IO
NIO包括:Channel、Buffer、Selector
NIO是面向缓冲区的,传统IO是面向流的;传统IO基于字节流、字符流进行操作。NIO基于Channel和Buffer进行操作,数据总是从Channel读到Buffer,从Buffer写到Channel。传统IO是阻塞的,NIO是非阻塞的,实现了异步操作。
2.Channel
Stream是单向的,Channel是双向的。
NIO的Channel有:
- FileChannel
FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。(可用于文件复制,速度比流处理快很多。(内存映射机制))- DatagramChannel
- SocketChannel
- ServerSocketChannel
注:FileChannel为什么无法设置为非阻塞模式
源码层:源码中FileChannel类中没有configureBlocking()方法,所以不能设置我非阻塞模式,因此也就无法和Selector配合使用,无法注册Selector。
其它:Selector的设计理念是,如果打开了多个通道,并且每个通道的流量都很低的时候,使用Selector会很方便,比如QQ,阿里旺旺。而FileChannel一般适用于大文件的复制,流量很大,没有必要设置成非阻塞的。
3.Buffer
NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short。当然NIO中还有MappedByteBuffer, HeapByteBuffer, DirectByteBuffer等。
Buffer实际上是一个容器,一个连续数组。
它的位置状态变量有:
- capacity:缓冲区数组的总长度
- position:下一个要操作的数据元素的位置
- limit:缓冲区数组中不可操作的下一个元素的位置:limit<=capacity
- mark:用于记录当前position的前一个位置或者默认是-1