• 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());
        }
    }
  • 相关阅读:
    [附源码]Python计算机毕业设计大学生兼职系统
    红帽认证 | RHCE考试包括哪些内容?
    大数据时代精准营销是提升品牌竞争力的核心
    OpenStack 下 CentOS6.X 镜像网络初始化失败问题排查
    【Docker项目实战】使用Docker部署HFish蜜罐系统
    logo商标识别易语言代码
    PYTHON用[有向图-邻接表]来描述社交网络中的[关注关系]
    2000-2019年中国灌溉耕地分布数据集
    Angular-04:指令
    git遇到的报错
  • 原文地址:https://blog.csdn.net/weixin_42240941/article/details/126017418