NIO Buffer
java.nio包下的Buffer是一个抽象类,它本身是一个容器,称作缓冲区。
public abstract class Buffer {
......
}
其常见子类包括ByteBuffer、CharBuffer、LongBuffer、IntBuffer、DoubleBuffer、ShortBuffer、FloatBuffer(注意是没有Boolean类型的Buffer)
Buffer中比较重要的4个属性:position、limit、capacity、mark。
capacity(容量): 表示一个buffer能够容纳数据元素的最大数量,其取值不会为负数,一旦初始化便不可杯被改变
//创建指定长度的缓冲区,其capacity的取值为10
IntBuffer buf = IntBuffer.allocate(10);
limit():表示buffer中所装载的元素的个数
position:表示位置,一个buffer的position指的是下一个将要读或者写的元素的索引(索引的取值为0、1、2、3…),position的位置主要由get()和put()方法来进行更新。
常用方法:
flip():作用是用于复位,即先将limit的取值设置为position,然后再将position的取值设置为0,如下为源代码中该方法的具体操作
public final Buffer flip() {
limit = position; // 将limit设置为position
position = 0; // position重置为0
mark = -1; // 丢弃标记
return this;
}
get(int index): 作用是获取buffer中索引值为index的元素,该方法也称为绝对取出,不会影响position的位置
put(int index,int i):作用是将buffer中索引值为index的位置的值替换为新的取值 i,该方法也称为绝对存入,不会影响postion的位置
get():作用是获取buffer中position所处的位置的值,调用该方法后position的取值会加1
put(int i):作用是为buffer中position所处的位置赋值,调用该方法后position的取值会加1
以下为其子类IntBuffer的基本操作的代码展示:
import java.nio.IntBuffer;
public class TestBuffer {
public static void main(String[] args) {
// 1.基本操作
//创建指定长度的缓冲区
IntBuffer buf = IntBuffer.allocate(10); //初始化完成后position的取值为0
buf.put(13); //调用put(int i)方法后,position的取值由0变为1
buf.put(21); //调用put(int i)方法后,position的取值由1变为2
buf.put(35); //调用put(int i)方法后,position的取值由2变为3
buf.flip(); //flip()方法表示复位,position的取值由3变为0
System.out.println("使用flip复位:" + buf);
System.out.println("容量为: " + buf.capacity()); //容量一旦初始化后不允许改变(warp方法包裹数组除外)
System.out.println("限制为: " + buf.limit()); //由于只装载了三个元素,所以可读取或者操作的元素为3 则limit=3
System.out.println("获取下标为1的元素:" + buf.get(1));
System.out.println("get(index)方法,position位置不改变:" + buf);
buf.put(1, 4);
System.out.println("put(index, change)方法,position位置不变:" + buf);
for (int i = 0; i < buf.limit(); i++) {
//调用get方法会使其缓冲区位置(position)向后递增一位
System.out.println(buf.get() + "\t");
}
System.out.println("buf对象遍历之后为: " + buf);
// 2.wrap方法使用
/**
// wrap方法会包裹一个数组: 一般这种用法不会先初始化缓存对象的长度,因为没有意义,最后还会被wrap所包裹的数组覆盖掉。
// 并且wrap方法修改缓冲区对象的时候,数组本身也会跟着发生变化。
int[] arr = new int[]{1,2,5};
IntBuffer buf1 = IntBuffer.wrap(arr);
System.out.println(buf1);
IntBuffer buf2 = IntBuffer.wrap(arr, 0 , 2);
//这样使用表示容量为数组arr的长度,但是可操作的元素只有实际进入缓存区的元素长度
System.out.println(buf2);*/
// 3 其他方法
IntBuffer buf1 = IntBuffer.allocate(10);
int[] arr = new int[]{1,2,5};
buf1.put(arr);
System.out.println(buf1);
//一种复制方法
IntBuffer buf3 = buf1.duplicate();
System.out.println(buf3);
//设置buf1的位置属性
//buf1.position(0);
buf1.flip();
System.out.println(buf1);
System.out.println("可读数据为:" + buf1.remaining());
int[] arr2 = new int[buf1.remaining()];
//将缓冲区数据放入arr2数组中去
buf1.get(arr2);
for(int i : arr2){
System.out.print(Integer.toString(i) + ",");
}
}
}
还没有评论,来说两句吧...