3.java语言实现socket编程之NIO-buffer的api

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);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值