ByteBuffer的原理和使用详解

news2025/7/23 13:53:15

ByteBuffer是字节缓冲区,主要用户读取和缓存字节数据,多用于网络编程,原生的类,存在不好用,Netty采用自己的ByteBuff,对其进行了改进

1.ByteBuffer的2种创建方式


1.ByteBuffer buf = ByteBuffer.allocate(int size);
方式1的buf缓冲区存储在堆内存中,内存开销在JVM中,受GC影响,会多拷贝一次,因为java程序收到的数据首先被系统内存所获取,然后再拷贝给JVM

2.ByteBuffer buf = ByteBuffer.allocateDirect(int size);
方式2的buf在系统直接内存中创建,内存开销在JVM之外,读写效率高(不受GC影响,0拷贝),但是分配效率低,使用后若不释放,会造成内存泄漏

下图是不同容量情况下,两种ByteBuffer的读写效率,根据需求选择创建方式:


2.字符串转成ByteBuffer的3三种方式


方式1: 采用put()方法,读数据时需要调用flip()切换为读模式

ByteBuffer buf = ByteBuffer.allocate(int size);
   buf.put(msg.getBytes());


方式2:以特定编码格式将String转换为ByteBuffer

ByteBuffer buffer1 = StandardCharsets.UTF_8.encode("hello");


方式3:调用ByteBuffer.wrap()

ByteBuffer buf = ByteBuffer.wrap(msg.getBytes());


3.Bytebuffer的读写底层原理


Bytebuffer的数据读写主要采用三个参数来控制

1.position:起始下标
2.limit:限制下标
3.capacity:buffer的容量


核心思想:Bytebuffer的读写共用position、limit参数,因此需要切换至读模式(调用flip())和写模式(调用)

一.开始时,position指向0,limit指向capacity


二.写模式下,写数据时,Position会不断前移

 

三.调用flip()切换为读模式,此时Postion置为已有数据的起始下标,limit置为已有数据的末尾下标

 


四.调用clear()方法切换为写模式,采用清空缓冲区,将potision置为0,limit置为capacity


至此,我们知道读写模式由于共用相同的position等参数,因此,需要切换模式,才能正确的读写。

并且在发生一次写读(先写后读)切换后,需要调用clear()方法进行重置,才能进行一轮新的写读

当然,你可以连续写或连续读,读读或写写可以连续执行,不需要额外操作。例如:

ByteBuffer buf = ByteBuffer.allocate(int size);
   buf.put(msg.getBytes());  //ok
   buf.put(msg2.getBytes());  //ok


存在的问题:

读操作后,重新写,调用clear()会重置至0的问题,如果没有读完呢?

例如 存在接收到的数据是不完整的,无法进行读操作,那么需要在原来的基础上,继续写数据怎么办?

答案是 Buffer.compact() 切换到写入模式

五. 调用compact方法切换为写模式,在不清空缓冲区的前提下,继续写如信息,将未读取的数据前移,postion指针置为未读取数据的末尾下标,limit置为capacity


上图左侧灰色是已读部分数据,绿色是未读部分,在此基础上,调用compact继续写,会进行部分清楚操作,同时保留未读部分,这也是推荐的用法。

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

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

相关文章

如何利用GPT大语言模型来进行A股投资分析

在当今的金融市场中,投资已经成为了许多人增加财富的重要途径。然而,投资并非易事,需要对市场有深入的理解和精准的判断。在这个过程中,工具的选择和使用就显得尤为重要。今天,我们将介绍一种结合了GPT大语言模型的投资…

基于u-box GPS模块通过串口指令调整输出信息

基于u-box GPS模块通过串口指令调整输出信息 ✨当然借助u-center_v22.07上位机软件,可以很方便的修改和调整输出信息以及配置,本次主要是通过该软件提取对应的配置指令,用于给单片机来配置GPS模块提供方便,从而不依赖通过电脑上位…

任正非说:如此华为公司怎么会垮掉呢?我坚信华为红旗永不倒!

你好!这是华研荟【任正非说】系列的第25篇文章,让我们聆听任正非先生的真知灼见,学习华为的管理思想和管理理念。 一、我们要持续地表彰那些为IT S&P、IPD、ISC、海外ERP、IFS……做出贡献的人。昨天他们努力时,看起来是笨拙的…

快速搭建自己的应用,尽在 YonBuilder:让你的想法瞬间成真!

目录 一、前言 1、一款出色的低代码开发平台是什么样? 2、什么是YonBuilder? 二、使用YonBuilder创建一个可视化应用 1、流程介绍 2、测试思路 3、环境准备 4、应用创建 5、数据建模 6、页面建模 7、数据分析 8、页面发布 三、总结 1、站在…

算法与数据结构-分治算法

文章目录 什么是分治算法分治算法应用举例分析分治思想在海量数据处理中的应用 什么是分治算法 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问…

Kubuntu安装教程

目录 1.介绍 2.安装 3.配置 更新软件 中文输入法 美化 1.介绍 Kubuntu,是众多Ubuntu分支的一种,它采用KDE Plasma桌面为其默认桌面环境。它和Ubuntu采用同样的底层系统和软件库。基本上,Kubuntu和Ubuntu没有太大的差异,只是…

警惕听力下降的七大因素,一定要当心

随着现代社会的高速发展,工作生活节奏的加快,各种压力增大,再加上熬夜,长期佩戴耳机、饮食油腻辛辣等不良生活习惯的影响,听力损伤人群越来越多,已经不仅仅影响老年人群,近年来,听力…

Avro 如何生成java Bean

作为一种很犀利的序列化的格式,avro在大数据量传输的时候很有优势。记录下。 1: .avsc 文件 {"namespace": "com.avro.bean","type": "record","name": "UserBehavior3","fields&qu…

第17期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

气象学基础知识:城市/大气/对流边界层

气象学基础知识:城市/大气/对流边界层 1 城市边界层(urban boundary layer, UBL)1.1 定义1.2 城市边界层结构的影响因素 2 大气边界层(Atmospheric boundary layers, ABL):2.1 定义2.2 大气动力层分层&…

前端基础之CSS

目录 一、CSS介绍 CSS语法 CSS注释 CSS的几种引入方式 二、CSS选择器 基本选择器 组合选择器 属性选择器 分组和嵌套选择器 伪类选择器 伪元素选择器 选择器的优先级 三、CSS属性相关 宽和高 字体属性 文字属性 背景属性 边框 border-radius display属性 …

【已解决】虚拟机之前能正常上网,重启之后无法连接网络问题的解决方法

虚拟机之前网络正常,重启之后却始终连接不上网络。 找了许多方法,终于发现一种便捷有效的方法。 解决方法如下: 1、将网络模式更改为NAT模式., 2、打开终端窗口,输入如下命令。 sudo service network-manager stopsudo rm /var/l…

R数据分析:反事实框架和因果中介的理论理解

其实很早之前给大家写中介分析的做法的时候我也有思考过当中介变量或者因变量不是连续变量的时候,中介怎么做?或者说这个时候中介的结果如何解释?当时反正是一直没有太想明白这些问题,毕竟这些情况在发表的文献中也较少见&#xf…

作为20年老程序员,我如何使用GPT4来帮我写代码

如果你还在用google寻找解决代码bug的方案,那你真的out了,试试gpt4, save my life. 不是小编危言耸听,最近用gpt4来写代码极大地提高了代码生产力和运行效率,今天特地跟大家分享一下。 https://www.promptspower.comhttps://www.…

.WP、.WL、.WT格式数据转Shp解决方案

下载 http://dt3.8tupian.net/2/29913a52b1000.pg3操作办法:mapgis创建数据库——导入.WP、.WL、.WT格式数据——导出shp数据 (1)安装mapgis10.6高级版(有一个月得试用期); (2)打开mapgis右侧MapGISLocal右键创建数据库&#xff…

Day15力扣打卡

打卡记录 使数组变美的最小增量运算数&#xff08;动态规划&#xff09; 链接 class Solution { public:long long minIncrementOperations(vector<int>& nums, int k) {long long f0 0, f1 0, f2 0;for (int x : nums) {long long inc f0 max(k - x, 0);f0 …

【计算机网络笔记】传输层——可靠数据传输原理之Rdt协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

2023年10月随笔之婚宴趣事多

1. 回头看 日更坚持了304天。 读《高性能MySQL&#xff08;第4版&#xff09;》更新完成 学信息系统项目管理师第4版系列主体部分更新完成&#xff0c;仅余结语预计11月5日后更新 读《图数据库实战》开更 10月码字125384字&#xff0c;日均码字数4044字&#xff0c;累计码…

如何创建 SpringBoot 多模块项目

1. 创建父模块 【添加依赖】 【删除父模块资源】 父模块只需要保留 pom.xml&#xff0c;其他文件的全部删除&#xff08;包括 src&#xff09; 2. 创建子模块 3. 修改父模块 3.1 删除不必要的依赖 3.2 添加打包类型 3.3 添加所有子模块 声明子模块有两个好处&#xff1a; …

LeetCode136——只出现一次的数字

LeetCode136——只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 R…