• 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());
        }
    }
  • 相关阅读:
    .NET的键盘Hook管理类,用于禁用键盘输入和切换
    记录一下我的Ruby On Rails的systemd服务脚本
    【SSO单点登录】ticket+token+redis 实现sso单点登录 && 防重放、防盗用、防篡改
    Docker启动SpringBoot简单例子
    大麦网回流票监控,sing参数分析
    接口封装如何实现?
    1688图片搜索商品接口(以图搜索商品接口)代码对接教程
    C++学习之动态内存
    MySQL数据库精讲001——概述
    数据传输如何做才安全:保障隐私的5大秘诀!
  • 原文地址:https://blog.csdn.net/weixin_42240941/article/details/126017418