buffer对象的api实现案例

在本文中,对buffer对象的一个具体实现intbuffer进行了demo的代码编写。涉及到了常用的api。重点在于buffer对象3个属性的理解(pos,lim,cap)。原生的api很难用,但是提供了一种很好的思想。出现了优秀的框架,如netty,对原生的api进行了封装,就很好用了。

buffer的基本操作

//1.基本操作
//创建指定长度的缓冲区,类似c语言的malloc函数。一旦定义cap容量不变。
IntBuffer buffer = IntBuffer.allocate(10);
//初始化之后,buffer的打印状态[pos=0 lim=10 cap=10]
System.out.println("init buffer = " + buffer);
//put,写入方法,会影响pos的位置,不影响limit的位置
buffer.put(1);//pos:0---》1
buffer.put(2);//pos:1--》2
buffer.put(3);//pos:2---》3
//[pos=3 lim=10 cap=10]
System.out.println("buffer after put= " + buffer);
//复位buffer,即pos置为0,limit设置为实际的元素数量,可以理解为读写的模式的切换。
buffer.flip();
//复位buffer之后,[pos=0 lim=3 cap=10]
System.out.println("buffer after flip= " + buffer);
//读取下表为1的元素,下标是从0开始的。取出来2
System.out.println("buffer[1] = " + buffer.get(1));
//get之后,pos位置不变[pos=0 lim=3 cap=10]
System.out.println("buffer after get = " + buffer);
//指定位置放入元素
buffer.put(1,4);
//指定位置放入元素,pos位置不变。
System.out.println("buffer after put(index,change)= " + buffer);
//遍历buffer中的元素
for (int i = 0; i < buffer.limit(); i++) {
//get方法执行一次,pos++
System.out.println(buffer.get());
}

wrap(包裹)方法的使用

//2.wrap方法的使用
//wrap方法会包裹一个数组:一般这种方法不会先初始化缓存对象的长度,因为没有意义。
// 最后还是会被wrap所包裹的数组覆盖掉。
//并且wrap对象修改缓冲区对象的时候,数组本身也发生着变化。
int[] arr = new int[]{1,2,5};
IntBuffer buffer1 = IntBuffer.wrap(arr);
System.out.println("buffer1 = " + buffer1);
//还可以选择具体的部分元素存入buffer中,这种写法是放入第1,2个元素。
IntBuffer buffer2 = IntBuffer.wrap(arr,0,2);
//这种使用方式,buffer的容量为数组的长度3,但是可操作元素只有放入的2个。所以wrap方法改变limit
System.out.println("buffer2 = " + buffer2);

其他方法

//3.其他方法
//往缓冲区中放入具体的数组[pos=3 lim=10 cap=10]
IntBuffer buffer = IntBuffer.allocate(10);
int[] arr = new int[]{1,2,4};
buffer.put(arr);
System.out.println("buffer = " + buffer);
//实现复制:[pos=3 lim=10 cap=10]
IntBuffer buffer1 = buffer.duplicate();
System.out.println("buffer1 = " + buffer1);
//定位pos属性的方法:[pos=1 lim=10 cap=10]
buffer.position(1);
System.out.println("buffer = " + buffer);
//找到刻度数据remaining,limit-pos获得该数据,含义为可读数据。
System.out.println("buffer.remaining = " + buffer.remaining());
//将缓冲区的数据放入数组中备用
int[] arr2 = new int[buffer.remaining()];
buffer.get(arr2);
for (int i:arr2) {
System.out.println("i = " + i);
}