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()); } }
根据上述的执行原理,我们查看结果