Java:NIO buffer 原理理解
NIO 是同步,非阻塞
NIO 和 BIO 最大不同在于
BIO是面向流的
NIO是面向块(缓冲区)的
NIO将文件或文件中的一段区域映射到内存中,可以像访问内存一样访问文件
那么今天我们打卡点知识就是 java NIO 中的 缓冲区接口 Buffer
Buffer
我们以 cahrBuffer为例子
capacity 总体容量大小
limit 存储容量的大小,是可读写和不可读写的界线
position 已读容量的大小,已读和未读区域的界线
【使用原理】
a) 初始化,给定总容量,position=0, limit=capacity
b) 当使用put方法存入数据是,通过position来记录存储的容量变化,position不断后移,直到存储结束(写完成)
c)写完成需要调用flip方法刷新,limit=position,position=0
保障limit记录的是可读写区域的大小,position已读部分重置为空
d) 读数据直到读完成,需要调用clear方法,position=0, limit=capacity
【示例代码】
public class BufferTest {
public static void main(String[] args) {
CharBuffer charBuffer = CharBuffer.allocate(8);
System.out.println("=========初始化");
System.out.println("capacity:" + charBuffer.capacity());
System.out.println("position:" + charBuffer.position());
System.out.println("limit:" + charBuffer.limit());
System.out.println("=========存储");
charBuffer.put('h');
charBuffer.put('y');
charBuffer.put('c');
System.out.println("position:" + charBuffer.position());
System.out.println("limit:" + charBuffer.limit());
charBuffer.flip();
System.out.println("=========调用flip");
System.out.println("position:" + charBuffer.position());
System.out.println("limit:" + charBuffer.limit());
System.out.println("=========读取数据");
//没有参数就是读取第一个,且会用 position 记录
//有参数 不会使用position记录
//System.out.println(charBuffer.get());
//System.out.println(charBuffer.get(1));
//遍历方法
//while (charBuffer.hasRemaining()) {
// System.out.println(charBuffer.get());
//}
//标记
charBuffer.mark();
System.out.println(charBuffer.get());
System.out.println("position:" + charBuffer.position());
System.out.println(charBuffer.get());
System.out.println("position:" + charBuffer.position());
//回退到标记的 position
charBuffer.reset();
System.out.println("========调用reset方法");
System.out.println(charBuffer.get());
System.out.println("position:" + charBuffer.position());
System.out.println("limit:" + charBuffer.limit());
charBuffer.clear();
System.out.println("=========调用clear");
System.out.println("position:" + charBuffer.position());
System.out.println("limit:" + charBuffer.limit());
}
}
根据上述的执行原理,我们查看结果
到这里,今天的NIO 缓冲区的知识就打卡完毕咯