ByteBuffer常用方法与分析

news2024/10/7 16:21:53

目录

目标

常用API

工具方法

演示案例

allocate(int capacity)和allocateDirect(int capacity)

put()和get()

flip()和hasRemaining()

clear()

compact()

 wrap()

总结


目标

掌握ByteBuffer常用方法,分析ByteBuffer对象在切换读写模式的情况下基本属性的变化情况。

常用API

方法描述案例
allocate(int capacity)分配capacity个字节的缓冲区。返回HeapByteBuffer对象,即jdk内存堆字节缓冲区。ByteBuffer buffer = ByteBuffer.allocate(8);
allocateDirect(int capacity)分配capacity个字节的缓冲区。返回DirectByteBuffer对象,即直接内存字节缓冲区。ByteBuffer buffer = ByteBuffer.allocateDirect(8);
compact()将ByteBuffer切换到写入模式,从position处将缓冲区的字节移动到起始位置。buffer.compact();
get()从ByteBuffer中读取1个字节,并将position向后移动1位。buffer.get();
get(int index)根据index获取指定位置的字节,不会移动position。buffer.get(1);
put(byte[] src)向ByteBuffer写字节数组数据。buffer.put(new byte[]{'1','a'});
buffer.put("1a".getBytes());
put(byte b)向ByteBuffer写字节数据。buffer.put((byte)127);
wrap(byte[] array)向ByteBuffer写字节数组数据。对缓冲区的修改将导致数组被修改,反之亦然。
新缓冲区的大小和limit为字节数组的长度。
ByteBuffer.wrap("Hello World.".getBytes());
flip()将ByteBuffer切换到读模式,position设置为0,limit设置为ByteBuffer内最后1个字节所在的索引数。buffer.flip();
clear()将position设置为0,limit设置为capacity,mark被丢弃。buffer.clear();
capacity()获取ByteBuffer的容量大小。buffer.capacity();
hasRemaining()position和limit之间是否有任何元素。buffer.hasRemaining();

工具方法

    public void bufferDetails(ByteBuffer buffer) {
        System.out.print("position="+buffer.position());
        System.out.print(";limit="+buffer.limit());
        System.out.println(";capacity="+buffer.capacity());
        //读取数据不移动索引。
        for (int i = 0; i < buffer.limit(); i++) {
            System.out.print(buffer.get(i));
            System.out.print(" ");
        }
        System.out.println("\n");
    }

演示案例

allocate(int capacity)和allocateDirect(int capacity)

    /**
     * JVM堆内存字节缓冲区
     * 直接内存字节缓冲区
     */
    public void allocateTest(){
        ByteBuffer buffer = ByteBuffer.allocate(8);
        //是否是直接直接内存字节缓冲区
        System.out.println(buffer.isDirect());

        ByteBuffer buffer2 = ByteBuffer.allocateDirect(8);
        //是否是直接直接内存字节缓冲区
        System.out.println(buffer2.isDirect());

    }

put()和get()

    /**
     * 从ByteBuffer中读取1个字节,并将position向后移动1位。
     */
    public void getAndPutTest(){
        ByteBuffer buffer = ByteBuffer.allocateDirect(20);
        //注意:这里写入的字节数据size不可以超过ByteBuffer的容量,否则报错。
        buffer.put("Hello World !".getBytes());
        //切换到读模式
        buffer.flip();
        //position=0
        System.out.println(buffer.position());
        //输出72,ASCII表中H就是72
        System.out.println(buffer.get());
        //position=1
        System.out.println(buffer.position());
        //继续读取字节缓冲区返回position=1位置的数据,即返回e。
        System.out.println((char)buffer.get());
    }

flip()和hasRemaining()

    /**
     * flip():将ByteBuffer切换到读模式,position设置为0,limit设置为ByteBuffer内最后1个字节所在的索引数。
     * hasRemaining()	position和limit之间是否有任何元素。
     */
    public void flipTest() {
        ByteBuffer buffer = ByteBuffer.allocateDirect(16);
        //注意:这里写入的字节数据size不可以超过ByteBuffer的容量,否则报错。
        buffer.put("123456789".getBytes());
        bufferDetails(buffer);
        //切换到读模式
        buffer.flip();
        bufferDetails(buffer);
        //读取数据并移动position。
        while(buffer.hasRemaining()){
            System.out.println(buffer.get());
        }
        //position=9。
        bufferDetails(buffer);
    }

打印结果

clear()

    /**
     * clear():将position设置为0,limit设置为capacity,mark被丢弃。
     */
    public void clearTest() {
        ByteBuffer buffer = ByteBuffer.allocateDirect(16);
        //注意:这里写入的字节数据size不可以超过ByteBuffer的容量,否则报错。
        buffer.put("123456789".getBytes());
        //切换到读模式
        buffer.flip();
        //读取数据并移动position。
        while(buffer.hasRemaining()){
            buffer.get();
        }
        //position=9。
        bufferDetails(buffer);
        //position=0;limit=16;capacity=16
        buffer.clear();
        bufferDetails(buffer);
    }

打印结果 

compact()

    /**
     * compact():将ByteBuffer切换到写入模式,从position处将缓冲区的字节移动到起始位置。
     */
    public void compactTest(){
        ByteBuffer buffer = ByteBuffer.allocateDirect(16);
        //注意:这里写入的字节数据size不可以超过ByteBuffer的容量,否则报错。
        buffer.put("123456789".getBytes());
        //切换到读模式
        buffer.flip();
        //读取1个字节。此时的buffer为:position=1;limit=9;capacity=16
        buffer.get();
        buffer.compact();
        bufferDetails(buffer);
        //切换到读模式
        buffer.flip();
        //position=0;limit=8;capacity=16,由此打印证明最后一个9不会被重复读取。
        bufferDetails(buffer);
    }

打印结果

 

 wrap()

    /**
     * 向ByteBuffer写字节数组数据。对缓冲区的修改将导致数组被修改,反之亦然。
     * 新缓冲区的大小和limit为字节数组的长度。
     */
    public void wrapTest(){
        byte[] bytes = "123456789".getBytes();
        ByteBuffer buffer =  ByteBuffer.wrap(bytes);
        bufferDetails(buffer);
        buffer.get();
        buffer.compact();
        bufferDetails(buffer);
        //打印234567899,证明了我们对ByteBuffer操作影响了byte[]数组。
        System.out.println(new String(bytes));
        bytes[2]='a';
        //打印了50 51 97 53 54 55 56 57 57,证明了我们对byte[]数组操作影响了ByteBuffer。
        bufferDetails(buffer);
    }

打印结果

总结

区分读模式和写模式的标准在于limit属性,如果ByteBuffer存在剩余空间,则:

  • limit=capacity表示当前为写模式
  • limit=数据量表示当前模式为读模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【REDIS】安装配置 可视化工具

Redis作为一个高性能&#xff0c;内存可存储化的no SQL数据库&#xff0c;近两年来发展迅猛&#xff0c;然而并没有比较成熟的管理工具来使用&#xff0c;或者是我不知道 下载redis 并安装&#xff1a; 双击安装&#xff0c;可以安装到d: 盘 配置文件是 .conf Redis作为一个…

排序——快排(递归/非递归)

目录 定义 递归 三种方法 1.hoare法 2.挖坑法 3.双指针法 整体 优化1 优化2 非递归 定义 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集…

快速掌握e语言,以js语言对比,快速了解掌握。

易语言&#xff0c;怎么调试输出&#xff0c;查看内容 在js语言里&#xff0c;弹窗是 alert()在易语言里&#xff0c;弹窗是 信息框 (“弹出显示内容”, 0, “标题”, ); 在js语言里&#xff0c;调试输出是 console.log()在易语言里&#xff0c;调试输出是 调试输出 (“输出内…

开发过程中使用,可以早点下班的coding小技巧

前言 在实际开发过程中,通过时间的沉淀,一些老人常常能写出一些让小白大吃一惊“骚操作”,那些“骚操作”通常简单的离谱,却能做很多事,属实是让很多新人摸不着头脑。 做一件事时间长了,技巧也就有了。 下面来个情景小剧场: 初入职场小鱼仔:这傻逼是不是写错了,~~ s…

基于凸几何和K均值的高光谱端元提取算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Sentinel统一异常处理

五.统一异常处理—BlockException 在上述规则测试中&#xff0c;当违反规则时&#xff0c;出来的异常信息页面不够友好和统一&#xff0c;我们可以通过设置统一的异常处理类&#xff0c;针对不同规则显示不同异常信息。 创建一个配置类&#xff0c;实现BlockExceptionHandler…

numpy数组,numpy索引,numpy中nan和常用方法

一&#xff1a;【numpy数组】 1.1为什么要学习numpy 1.快速 2.方便 3.科学计算的基础库 1.2什么是numpy 一个python中做科学计算的基础库&#xff0c;重在数值计算&#xff0c;也是大部分python科学计算库的基础库&#xff0c;多用于在大型&#xff0c;多维数组上执行数组运…

常用的键盘事件

1、键盘事件 键盘事件触发条件onkeyup某个键盘按键被松开时触发onkeydown某个键盘按键被按下时触发onkeypress某个键盘按键被按下时触发&#xff08;但它不识别功能键&#xff0c;比如ctrl、shift等&#xff09; 注意&#xff1a; 如果使用addEventListener不需要加ononkeypr…

Go 堆数据结构使用

说到 container/heap 下的堆数据结构&#xff0c;让我们不需要从零开始实现这个数据结构。如果只是日常工作&#xff0c;其实还挺难用到堆的&#xff0c;更多的还是在写算法题的时候会用到。 基本概念 堆分为大顶堆和小顶堆&#xff0c;区分这两种类型方便我们处理问题。大顶…

Docker安装Zookeeper教程(超详细)

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…

第六章:关系数据理论

一、问题的提出、范式 1、【多选题】下列说法中正确的是&#xff1a; 正确答案&#xff1a; ABCD 2、【多选题】关系模式R&#xff08;项目序号&#xff0c;项目代码&#xff0c;项目名称&#xff09;&#xff0c;项目序号是码。一个项目代码只有一个项目名称。下列说法不正确…

文献检索报告

文献检索第一篇检索作业总结第一章检索任务1.1检索课题1.2确定选题所属学科1.3中英文检索词第二章检索策略与结果2.1检索中文期刊文献2.1.1 CNKI中国期刊全文数据库2.1.2 维普期刊全文数据库2.1.3 万方期刊数据库2.1.4 超星期刊全文2.2检索中文学位论文2.2.1 CNKI博硕学位论文数…

virtio-net发包流程分析

virtio-net发包流程分析 virtio-net发包流程前端驱动部分 总流程 start_xmit|---->free_old_xmit_skbs /* 释放backend处理过的desc */|---->xmit_skb /* 调用xmit_skb函数将网络包写入virtqueue */| |---->sg_set_buf /* 数据包头部填入scatterlist */| | |---->…

手撕红黑树、三种情况就可玩转红黑

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、红黑树概念二、红黑树性质三、红黑树 插入①变色&#xff08;c红 p红 g黑 u存在且红&#xff09;②旋转&#xff08;c红 p红 g黑 u存在且…

熟人服务器被黑,五种实战方法强化linux服务器安全性!

公司护网行动,五种实战方法,下面直接上实操: 1.修改ssh端口为59527,并开放防火墙端口 修改ssh配置文件 /etc/ssh/sshd_config,将端口号修改为59527.同时保留ssh默认的22端口,为了防止修改端口号失败以后,远程登录不上服务器 2.修改firewall配置 默认情况下,防火墙是…

JVM——垃圾回收

垃圾回收 1、如何判断对象可以回收? 一、引用计数法 当一个对象被其他变量引用时&#xff0c;使其计数1&#xff08;若被引用两次&#xff0c;计数为2&#xff09;&#xff0c;若某个变量不在引用它时&#xff0c;使其计数-1&#xff1b;当这个对象引用计数变为0时意味着不…

吴恩达【神经网络和深度学习】Week1——深度学习概述

文章目录1、What is a neural network?2、Supervised Learning with Neural Networks2.1、Examples2.2、The classification of data3、Why is Deep Learning taking off&#xff1f;4、Quiz课程笔记整理按照所讲章节的标题来完成1、What is a neural network? 以房价预测模型…

基于HTML5 技术的开放自动化HMI

人机交互接口&#xff08;HMI&#xff09;是自动化系统中不可或缺的一部分。传统的做法是提供一个HMI 显示屏&#xff0c;并且通过组态软件来配置显示屏的功能&#xff0c;通过modbus 或者以太网与PLC 连接。 现在&#xff0c;事情变得复杂了许多&#xff0c;用户不仅需要通过专…

干货 | 关于PCB中的“平衡铜”,一文全部说明白

平衡铜是PCB设计的一个重要环节&#xff0c;对PCB上闲置的空间用铜箔进行填充&#xff0c;一般将其设置为地平面。 平衡铜的意义在于&#xff1a; 对信号来说&#xff0c;提供更好的返回路径&#xff0c;提高抗干扰能力&#xff1b;对电源来说&#xff0c;降低阻抗&#xff0c;…

Android 13 源码获取与构建

文章目录1. 环境准备1.1 基本信息1.2 系统初始化1.2.1 更新 Ubuntu 软件包1.2.2 安装 git 工具1.2.3 安装依赖包(Ubuntu 18.04)1.2.4 修改默认python版本1.2.5 安装 repo 工具2. 源码下载完成2.1 创建源码目录2.2 初始化源码仓库2.3 开始下载源码2.4 Android 13 源码目录3. 构建…