NIO的Buffer相关操作

Buffer简介

缓冲区(Buffer):本质上是一个数组,用于临时保存、写入以及读取数据。在Java NIO中,该内存块包含在NIO Buffer对象当中,NIO Buffer对象还提供了一组接口来访问该内存块。

根据数据类型的不同,Java为除了boolean类型之外的其余7种基本类型提供了相应类型的缓冲区,分别是ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBuffer。他们都继承自抽象类Buffer类,他们的管理方式也都几乎一样

IntBuffer 基本操作

package com.example.netty.socket.nio;

import java.nio.IntBuffer;

/**
 * NIO Buffer 操作
 * @author lanx
 * @date 2022/3/19
 */
public class TestBuffer {

    public static void main(String[] args) {
        // 1、 IntBuffer 基本使用
        IntBuffer buffer = IntBuffer.allocate(10);
        buffer.put(10); // position 位置 0 - > 1
        buffer.put(20); // position 位置 1 - > 2
        buffer.put(30); // position 位置 2 - > 3
        //把位置复位为0,也就是 position 位置  : 3->1
        buffer.flip();
        System.out.println("使用flip复位:"+buffer);
        System.out.println("容量为:"+buffer.capacity());//容量一旦被初始化不允许改变(warp 方法包裹的数组除外)
        System.out.println("限制为:"+buffer.limit());  // 由于只装载了3个元素,所以可读取或者可操作的元素数为3,则 limit = 3

        System.out.println("获取下标为1的数据:"+buffer.get(1));
        System.out.println("get(index)方法,position位置不变:"+buffer);
        buffer.put(1,100);
        System.out.println("put(index,change)方法,position位置不变:"+buffer);

        for (int i = 0 ; i< buffer.limit();i++){
            //调用get方法会使缓冲区位置(position)向后递增一位
            System.out.print(buffer.get() + "\t");
        }
        System.out.println("buffer的对象被遍历之后为:"+buffer);


        /**
         * 2. wrap 方法使用
         * wrap 方法会包裹一个数组,一般这种用法不会先初始化缓存对象的长度,因为没有意义,最后还是会被wrap所包裹的数组覆盖。
         * 并且warp方法修改缓冲区对象的时候,数组本身也会跟着变化。
         */

        int[] arr = new int[]{1,2,5};
        IntBuffer buffer1 = IntBuffer.wrap(arr);
        System.out.println("buffer1:"+buffer1);

        //这样使用表示容量为数组arr的长度,但是可操作的元素只有实际进入缓冲区的元素长度
        IntBuffer buffer2 = IntBuffer.wrap(arr,0,2);

        System.out.println("buffer2:"+buffer2);
        for (int i = 0 ; i< buffer2.limit();i++){
            //调用get方法会使缓冲区位置(position)向后递增一位
            System.out.print(buffer2.get() + "\t");
        }

        /**
         * 3. 其它方法
         */

        IntBuffer buffer3 = IntBuffer.allocate(10);
        int[] arr1 = new int[]{1,2,5};

        buffer3.put(arr1);
        System.out.println("buffer3:"+buffer3);
        //一种复制的方法
        IntBuffer buffer4 = buffer3.duplicate();
        System.out.println("buffer4:"+buffer3);
        //设置 buffer3 的位置属性
        buffer3.position(1); // 自定义协议 --> [包头head<5> 包体body<>]
        System.out.println("buffer3:"+buffer3);

        System.out.println("buffer3 可读的数据为:"+buffer3.remaining());

        //初始化数组长度
        int[] arr3 = new int[buffer3.remaining()];
        //将缓冲区数据放入 arr3数组中
        buffer3.get(arr3);
        for (int i : arr3){
            System.out.print(Integer.toHexString(i)+",");
        }

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终遇你..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值