NIO释义:non-blocking io 的简写,即 非阻塞 IO
1. Channel
channel类似stream,但更加底层,是读写数据的双向通道,可将channel的数据写入buffer,也可将buffer的数据写入channel
常见的Channel:
FileChannel、DatagramChannel、
SocketChannel、ServerSocketChannel
2. Buffer
buffer用来缓冲读写数据,类似一个缓冲区
常见的buffer:
ByteBuffer(MapperByteBuffer、DirectByteBuffer、HeapByreBuffer)、
ShortBuffer、IntBuffer、LongBuffer、
FloatBuffer、DoubleBuffer、CharBuffer
我们主要了解一下ByteBuffer
2.1.结构:
2.1.1.重要属性:
capacity:容量
position:(写入/读取) 位置
limit:(写入/读取) 限制
2.1.2.向buffer写入数据的两种方式:
调用channel的read方法:
int readBytes = channel.read(buffer);
调用buffer自己的put方法
buffer.put(abc);
2.1.3从buffer读取数据的两种方式:
调用channel的write方法:
int writeBytes = channel.write(buffer);
调用buffer自己的get方法:
byte b = buffer.get();
注意:get方法会让position读指针往后走,如果想要重复读取数据
调用rewind方法将position重置为0
调用get(index)方法(index为整数),获取索引index的内容,该方法不会移动读指针
2.2使用方式:
1、向buffer写入数据,例如调用channel.read(buffer),该方法表示从channel中读取数据并写入到buffer中。(注意:此时我们要站在buffer的角度)
2、调用flip( )从写模式切换至读模式
3、从buffer读取数据,例如调用buffer.get( )。
4、调用clear( )方法或者compact( )方法。
clear( )方法:position被设回0,limit被设置成 capacity的值。
compact( )方法:将所有未读的数据拷贝到Buffer起始处,然后将position设到最后一个未读元素后面。limit属性设置成capacity的值
重复步骤1~4