Java NIO 全称java non-blocking IO ,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的.
Buffer:缓冲区本质是一块可以读写的内存块,可以理解成一个数组,该对象提供了一组方法,可以更轻松的使用该内存块。Channle提供网络读取数据的通道,但是读取和写入都必须经过Buffer
//创建一个指定大小大小为10字节的缓冲区
ByteBuffer allocate = ByteBuffer.allocate(10); //堆内存
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10); //堆外内存
//创建一个有内容的缓冲区
ByteBuffer wrap = ByteBuffer.wrap("abc".getBytes());
ByteBuffer allocate = ByteBuffer.allocate(10);
//获取当前要操作的索引位置,是从position这个位置开始,写要从该位置开始写,即使前面没有数据,也只能从这里开始写
//新创建的Buffer的position就是为0,也就是可以从索引第0个位置开始写入数据
int position = allocate.position();
//设置索引位置在某个位置,如果我们想从索引为1的位置开始写,就可以设置position的值
allocate.position(1);
//limit表示我们最多能操作到那个位置,Buffer底层是个数组。这时候我们创建了一个容量等于10的Buffer
//在创建的时候limit = 10,也就是说我们只能写到索引为10的这个位置,在往后写就会报错
int limit = allocate.limit();
//我们也可以设置limit的值,比如设置成8,那就只能写到索引为8的这个位置,后面的就不能写
allocate.limit(8);
//表示的是数组的总的容量
int capacity = allocate.capacity();
//表示还有多少个索引能够被操作
// 比如你创建了个容量 = 10的Buffer,此时你只写了5个索引的数据,那还剩下5个索引位置可以写,那么此时该方法返回的就是5,该值就等于 limit - position的值
int remaining = allocate.remaining();
//是否还能被操作,是否还有可以操作的索引
boolean b = allocate.hasRemaining();
ByteBuffer allocate = ByteBuffer.allocate(10);
//写切换成读模式,在写的时候,limit = 10,如果这时候插入了5个索引元素,此时position = 5;
//当切换成读模式,limit = position = 5,position = 0;因为读数据也是要根据position的位置来读,
//但是现在我们只能读取5个索引位置的元素,因为我们只插入了5个索引元素,所以limit = position来限制读取的范围
allocate.flip();
//读取一个字节,每读一个字节position就+1;
allocate.get();
//读多个字节
allocate.get(byte[] srcs);
//读取指定字节,读取指定索引数据不受position的影响
allocate.get(i);
//将position重新设置为0,可以重复读
allocate.rewind();
//切换成写模式,position = 0,limit = capacity(数组总的容量)
allocate.clear();
//转换成数组
byte[] array = allocate.array();
通常来说NIO的所有IO都是从Channel(通道)开始的,NIO通道类似于BIO中的流,但是又有区别
为什么NIO需要Selector选择器呢。假设NIO没有这个Selector选择器,那么此时一个客户端连接过来就要对应的一个线程去处理,但是这个客户端可能只是连接一下,并不会立马就会有读写事件,那么此时依然会造成线程的阻塞,导致资源的浪费
但是有了Selector之后,客户端发送连接请求之后,服务端就把对应的SocketChannle注册到Selector上去。如果这时候该客户端Channle上有读写事件发生,再把请求交给对应的线程处理,如果没有就不做任何处理,这样没有事件的时候线程不会处于阻塞状态,也不会导致系统资源的浪费,只有真正有事件发生的Channel才会交给对应的线程去处理
5.2:SelectionKey中定义的4种事件
留言与评论(共有 0 条评论) “” |