综述
NIO是Java1.4之后的新的一套IO接口,可以理解为非阻塞而不仅仅是new。
1、IO与NIO的区别
- IO是面向流的,如字节流和字符流;而NIO是面向缓冲的。
- IO是阻塞的,NIO是非阻塞的。
- NIO有选择器,而IO没有。
2、NIO基本概念
①、Selector
NIO引入了Selector选择器来监听多个通道事件,可以将多个通道注册到同一个Selector选择器中,然后创建一个线程管理这个选择器,这种情况下一个线程可以管理多个通道,并能够知道读写事件是否做好准备。
②、Channel和Buffer
NIO中的所有请求都是通过Channel开始的,数据可以从Channel读取到Buffer也可以从Buffer读取到Channel中。
NIO中Channel的具体实现有下面这几个:
DatagramChannel
SocketChannel
FileChannel
ServerSocketChannel
Buffer的实现如ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer等对应基本数据类型。
3、Buffer
Buffer的使用一般遵循下面的步骤
- 首先将数据写入buffer;
- 调用flip()方法切换读/取模式;
- 从buffer读数据;
- 调用clear()或者compact()方法
首先将数据写入到buffer中,然后调用flip()方法将buffer从写模式切换到读模式,在读模式下可以读取到之前写入到buffer的所有数据,一旦读取完成之后需要清空缓存区,以便可以再次被使用,清空缓存的方法有两个,一个是flip(),一个是compact()。clear()方法会清除整个缓存;而compact()只会清除已读的数据,未读的部分会被移到最前端,再次写入数据时会在之前未读的后面紧挨着写。
Buffer的capacity、position、limit
position和limit的值要取决于Buffer到底是在读模式还是在写模式,不管在读模式还是写模式capacity的值是不变的。
- ①、capacity,也即是Buffer的大小。
- ②、position代表当前位置,最大值为capacity - 1,buffer从写模式切换到读模式时position会被置为0。
- ③、limit表示可以向Buffer中写入多少数据,写模式下limit等于capacity,当切换到读模式时,limit的值就等于写模式下的position的大小,这样在读模式下就可以取出position到limit之间的所有数据,也就是之前写入的所有数据。
clear()与compact()方法
- clear()方法,将buffer清空,但并不是释放空间,而是将之前的数据遗忘,再次写入buffer时会覆盖掉原来的数据。
- compact()方法,此方法会将未读的数据复制到Buffer的起始出,position值为最后一个未读数据的后面,limit值为capacity的大小,此时写数据并不会覆盖原来的数据。