Bytebuffer源码剖析及实现原理

2023-05-16

Bytebuffer

官方解释A byte buffer,一个字节缓冲区。

一. 使用方法

  1. ByteBuffer 初始状态是写模式, 使用IO流即可写入数据,如: channel.read()

  2. 如果需要读取ByteBuffer中的数据调用filp()方法切换即可

  3. 从ByteBuffer中读取数据有很多API 最常用的有 ByteBuffer.get()方法

  4. 读取完成之后调用 clear()或者compact()切换至写模式

  5. 日常使用中重复 1~4步骤以节省服务器内存空间

二. ByteBuffer结构

  1. ByteBuffer 有以下属性
    capacity
    position
    limit
  2. 写模式下, position是写入位置,limit等于容量
    在这里插入图片描述
  3. flip动作发生后, position切换为读取位置, limit切换为读取限制
    在这里插入图片描述
  4. 读取了4个字节之后的状态如下
    在这里插入图片描述
  5. clear动作发生之后
    在这里插入图片描述
  6. 还可以使用compact()方法进行切换读写模式
    在这里插入图片描述

三. ByteBuffer 源码分析

  1. ByteBuffer的基础属性继承自Buffer, 其中 mark <= position <= limit <= capacity 四个属性代表的意思与上文介绍的一样,标记 <= 位置 <= 限制 <= 容量
  2. 如图↓, 我们最常使用的allocate()方法其实就是设置一个大于零的内存容器
    在这里插入图片描述
    其默认值分别为↓
// For speed these fields are actually declared in X-Buffer;
// these declarations are here as documentation
/**
    protected final byte[] hb;
    protected final int offset;
*/
HeapByteBuffer(int cap, int lim) {            // package-private
    super(-1, 0, lim, cap, new byte[cap], 0);
    
    /*
    hb = new byte[cap];
    offset = 0;
    */
}

HeapByteBuffer是ByteBuffer的其中一个子类, 有兴趣的可以去翻一下源码

同时还有另外一种方法创建ByteBuffer, 生成的ByteBuffer本质上不是一个类型的对象

System.err.println(ByteBuffer.allocate(16).getClass());
System.err.println(ByteBuffer.allocateDirect(16).getClass());
/*
    <class java.nio.HeapByteBuffer>      -java 堆内存,读写效率底. 会受到GC影响


    <class java.nio.DirectByteBuffer>    -直接内存, 读写效率高(少一次copy操作), 不会收到GC影响.
                                         分配的效率低,有可能会造成内存泄漏
 */
  1. ByteBuffer还有一些自己独有的属性, 这其中就包含了最具有代表性的read()事件
    在这里插入图片描述

    hb用于接收byte数组生成ByteBuffer
    offset: 数组偏移量, 用来告诉ByteBuffer从数组的哪个地方开始读取生成, offset不可以小于 0
    isReadOnly: 用来判断当前的ByteBuffer数组是否是只读模式, 如果需要切换则需要调用想用的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bytebuffer源码剖析及实现原理 的相关文章

随机推荐

  • 强化学习入门DQN详解

    Deep Q Network 参考资料 xff1a B站莫烦 xff1a https www bilibili com video BV13W411Y75P spm id from 61 333 337 search card all cl
  • 某项目因为多次流标导致实际项目时间严重压缩,我该咋办?

    问题 xff1a 某政府项目 xff0c 三个月前就开始招标 xff0c 因各种原因 xff0c 流标三次 xff0c 导致时间拖太长 原计划一期工期三个月 43 xff0c 1月底上线 xff0c 但因为招投标影响直到一个月前签订了合同
  • ROS创建工作空间及功能包流程总结整理(python)

    ROS创建工作空间及功能包流程总结整理 xff08 python xff09 参考资料 xff1a B站赵虚左 xff1a https www bilibili com video BV1Ci4y1L7ZZ p 61 19 amp vd s
  • ROS自定义发布消息类型

    ROS自定义发布消息类型 xff1a 在 ROS 通信协议中 xff0c 数据载体是一个较为重要组成部分 xff0c 在上一案例中 xff0c ROS 中通过 std msgs 封装了一些原生的数据类型 比如 String Int32 In
  • ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

    ROS服务通信具体实现流程 demo xff1a 实现两个整型数相加求和 xff0c 客户端发送两个整型数 xff0c 服务端对其求和 服务通信也需要自定义服务数据类型 xff0c 即自定义srv文件 xff0c 该过程和自定义msg文件非
  • ROS TF静态坐标变换实现

    ROS TF静态坐标变换实现 法一 xff1a 编码实现 发布方代码实现 xff1a 创建功能包并添加依赖 catkin create pkg tf static roscpp rospy std msgs tf2 tf2 ros tf2
  • ROS:Gazebo导入自定义环境

    Gazebo导入自定义环境 之前的案例gazebo中导入的是一个空世界empty world xff0c 这里会介绍如何导入房屋数目等自定义的环境 xff08 1 xff09 启动 gazebo 打开构建面板 xff0c 绘制仿真环境 xf
  • ROS导航实现:SLAM建图(slam_gmapping)与保存(map_server)

    导航实现 xff1a SLAM建图 先安装相关的ROS功能包 安装 gmapping 包 用于构建地图 sudo apt install ros lt ROS版本 gt gmapping 安装地图服务包 用于保存与读取地图 sudo apt
  • ROS导航实现:amcl定位

    ROS导航实现 xff1a amcl定位 xff08 1 xff09 首先编写启动amcl的launch文件 xff0c 这里建议复制粘贴模板 xff0c 再修改相关的参数即可 xff0c 步骤如下 xff1a 主目录下进入amcl文件 r
  • ROS导航实现之路径规划

    导航实现之路径规划 move base 功能包提供了基于动作 action 的路径规划实现 xff0c move base 可以根据给定的目标点 xff0c 控制机器人底盘运动至目标位置 xff0c 并且在运动过程中会连续反馈机器人自身的姿
  • 创建个人网站(github pages)并将站点一键托管到Github

    创建个人网站 xff08 github pages xff09 并将站点一键托管到Github 内容 xff1a 使用网站生成器mkdocs将markdown文件生成wiki站点并挂载到github的流程总结 亮点 xff1a 个人网站一键
  • 视觉SLAM十四讲(第2版)总结

    最近看完了 视觉SLAM十四讲 xff08 第2版 xff09 xff1a 从理论到实践 xff08 高翔等著 xff09 xff0c 原书分两部分 xff0c 先介绍了数学基础 xff0c 然后介绍了具体的SLAM实践 xff0c 非常适
  • 我的公众号 - 豆芽儿 软件研发人才生长社区

    为你系统分享敏捷开发 项目管理 需求分析 软件设计 UML 中层领导力 CMMI IT职场 ACP 软考 PMP等 高大上 的实用知识 xff0c 帮助你进阶为高端人才 xff01
  • Openblas 下载和使用方法

    Openblas 下载及使用 环境 xff1a 平台 xff1a Ubuntu 20 04 xff0c Orin xff1a Arm Cortex A78AE v8 2 64 bit 步骤 xff1a 1 去github 下载openbla
  • FreeRTOS学习记录

    FreeRTOS学习记录 前言FreeRTOS学习记录在STM32CubeMX中配置FreeRTOS 前言 本人小白 xff0c 最近学习了FreeRTOS操作系统 xff0c 打算做一点记录 学习的过程中虽然做了点练习 xff0c 不过都
  • 如何给华三交换机恢复出厂设置及命令

    如何给华三交换机恢复出厂设置及命令 在前几天 xff0c 上级单位线路重新规划 xff0c 需要我们将单位的线路进行改造 xff0c 这就涉及到了网络设备的重新配置 经查看 xff0c 上级接入交换机的业务端口配置为access xff0c
  • 解决Linux下Docker下载安装太慢

    卸载先前版本 yum remove docker docker span class token operator span client docker span class token operator span client span
  • sqlyong连接docker中的mysql 失败can‘t connect to MySQL server on (*******:3306)

    解决sqlyong连接docker中myslq失败 xff1a 一 查看mysql是否运行docker ps 二 查看mysql端口映射是否与连接相符 三 进入mysql容器查看是否能够进行本地连接docker exec it mysql
  • 解决springboot+webSocket出现404错误

    这是因为websocket创建的bean是由自己来管理的 需要将其创建的bean交给spring管理 创建websocketconfig span class token keyword package span com span clas
  • Bytebuffer源码剖析及实现原理

    Bytebuffer 官方解释A byte buffer xff0c 一个字节缓冲区 一 使用方法 ByteBuffer 初始状态是写模式 使用IO流即可写入数据 如 channel read 如果需要读取ByteBuffer中的数据调用f