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) + ",");
         }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值