ByteBuffer杂记

public static void main(String[] args) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(10);// 划分一块内存做缓冲区

    /*
    看构造过程,可以知道是
    以10构建一个byte[]

    当然考虑了字节序 boolean bigEndian

    而所有的切换clear rewind mark等等,都是基于index

    将position等等,修改,看调用函数的测试案例并无意义,直接看源码就知道了

     */

    { // 才申请的 byteBuffer的limit = 10,说明默认是写模式,毕竟没有数据,读不出来
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
    }
    { // 切换读,limit就是0了
        byteBuffer.flip();
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
    }
    { // 写三个数据进去
        byteBuffer.clear();
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
        byteBuffer.put((byte)1);
        byteBuffer.put((byte)2);
        byteBuffer.put((byte)3);
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
    }
    { // 读走一个数据
        byteBuffer.flip();
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
        System.out.println("--------------------------");
        System.out.println("read:"+byteBuffer.get());
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
    }
    { // compact之后,果然position为 3-1=2,且为写模式u
        byteBuffer.compact();
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
    }

    { // clear之后,从头开始写,但是数据还在
        // array 操作不会取走数据,或者说,get也不会取走数据,只是改了下标position,get(i)甚至不会改 position
        // 除了compact会真的修改到数据
        byteBuffer.clear();
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
        System.out.println(Arrays.toString(byteBuffer.array()));
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
        System.out.println(Arrays.toString(byteBuffer.array()));
    }
}

public static void main(String[] args) {
    // 居然有这种转换,为什么?
    ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode("哈");
    // jdk 开发者认为  字到字节是encode的过程,这个可以理解
    // 但是 为什么结果是byteBuffer,更加通常的应该是一个 byte[]
    // 是因为String.getBytes已经提供了此功能么,总感觉底层逻辑有混乱
    // 这不符合直觉

    { // 这种创建的buffer是读模式的,而不是写
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer.limit());
        System.out.println("now-positon:" + byteBuffer.position());
    }

    ByteBuffer byteBuffer2 = ByteBuffer.wrap("123".getBytes());//wrap-->包裹
    { // 这种创建的buffer是读模式的,而不是写, 或者说,创建时给了数据,就默认读,没给数据,就默认写
        System.out.println("--------------------------");
        System.out.println("now-limit:" + byteBuffer2.limit());
        System.out.println("now-positon:" + byteBuffer2.position());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值