javaNIO -- ByteBuffer 原理机制

news2024/11/29 10:47:13

说明

  1. @author blog.jellyfishmix.com / JellyfishMIX - github
  2. LICENSE GPL-2.0

概述

  1. ByteBuffer 可以理解为是一个 byte 数组,用于读取与写入。
  2. ByteBuffer 通过一些精巧的属性和方法, 更高效地使用内存空间。
  3. java NIO 中有 8 种缓冲区: ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer, MappedByteBuffer。其中最常用的是 ByteBuffer。

ByteBuffer 属性

  1. capacity: 表示缓冲区数组的最大容量。
  2. position: 表示当前指针的位置(下一个要操作的数据元素的位置)
  3. limit: 表示当前数组最大的使用量, 即有效位置的 EOF 位置(缓冲区数组中不可操作的下一个元素的位置), limit <= capacity
  4. mark: 用于记录某个时刻 position 的位置快照, 默认是 -1。这个属性不常用,为了便于理解忽略即可。

不同场景下属性的作用

  1. 写模式下, position 是写入位置, limit 等于容量。

在这里插入图片描述

  1. 调用 flip 方法后, position 切换为读取位置, limit 切换为读取限制。

在这里插入图片描述

  1. 读取了 4 个字节之后的状态如下:

在这里插入图片描述

  1. clear 动作发生后:

    在这里插入图片描述

ByteBuffer 方法

clear

切换为写模式。

将参数设置为 position=0, limit=capacity, mark=-1,类似于初始化,但不会清除 byte 数组的内容(即 clear 只是把 position 移到位置 0,并没有真正清空数据)。

在这里插入图片描述

flip

切换为读模式。

将参数设置为 limit=position, position=0, mark=-1, 翻转, 即将未翻转之前 0 到 position 之间的数据是翻转后的 position(即0) 到 limit 之间的这块区域,翻转将缓冲区的状态由写变为读。

在这里插入图片描述

rewind

将参数设置为 position=0, mark=-1, limit 的值不变(注意:指针指向0)。这样在读完一次后,把 position 重定向为 0, 即可从头开始读取。

reset

把 position 设置为 mark 的值,相当于之前通过 mark 记录了一个 position 位置快照,现在回退到快照位置。

remaining

return limit - position,即返回 limit 和 position 之间的相对位置差。表示未读取完的剩余数据量。

hasRemaining

return position < limit, 表示是否有未读取完的剩余数据。

compact

切换为写模式。

将 position 与 limit 之间的内容移动到 0 到 (limit - position) 之间的区域, 之前 0 到 position 间的数据被覆盖。position 的值变为 limit - position,limit 的值变为 capacity。如果之前 position == limit, 此时执行 compact 操作相当于 clear 操作。

在这里插入图片描述

get

可以理解为 getByte, 从 byteBuffer 里读取 1 个 byte, 以 byte 类型返回。同时 position += 1。

get(int index)

可以理解为 getByte(int index), 从 byteBuffer 里读取指定 position 位置的 1 个 byte, 以 byte 类型返回。但 position 位置不变。

getInt

从 byteBuffer 里读取 4 个 byte, 以 int 类型返回。同时 position += 4。

byteBuffer 里存储的都是 byte 类型的数据,调用方指定要 int 类型的返回值, 那就拿出来 4 个 byte, 以 int 类型返回。

getLong

从 byteBuffer 里读取 8 个 byte, 以 long 类型返回。同时 position += 4。

byteBuffer 里存储的都是 byte 类型的数据,调用方指定要 long 类型的返回值, 那就拿出来 8 个 byte, 以 long 类型返回。

使用方法

  1. ByteBuffer 初始状态是写模式, 使用 IO 流即可写入数据, 例如: channel.read(byteBuffer)
  2. 调用 flip 方法, 可以切换为读取模式。
  3. 调用 clear 或者 compact 方法切换至写模式。
  4. ByteBuffer 读取方法有很多, 最常用的是 get 方法。

拓展阅读

Java NIO 的数据运输大队:Buffer 与 Channel 详解 - 肖恩Sean - 掘金

java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别 - 峰的季节 - 博客园

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

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

相关文章

SpringBoot+MyBatis 搭建项目基本框架

参考资料:mall整合SpringBootMyBatis搭建基本骨架 一 背景 做的项目多了&#xff0c;就会发现&#xff0c;每次新项目起步&#xff0c;都是一样的。应该整理一个通用的模板来进行快速启动新项目。 二 使用到的框架简介 1.SpringBoot SpringBoot可以让你快速构建基于Spring…

【实践经验】Latex 表格列间距调整

目录 背景命令 背景 有时候表格列之间的空白区域很大&#xff0c;超出了页面宽度。这时候如果调整表格列与列之间的间隔&#xff0c;无需调整字体大小就能解决这个问题。 命令 \setlength\tabcolsep{3pt} 注意&#xff0c;需要将以上命令&#xff0c;插入到 \begin{table} …

【项目总结2023年6月3日记】:总结最近项目

项目总结&#xff0c;记录一下成长&#xff0c;欢迎大家一起学习&#xff0c;一起交流技术&#xff0c;谢谢支持。 项目&#xff1a;从车多色二维码识别&#xff0c;讲究的就是一个不差&#xff0c;识别的准准的 从车多色二维码识别&#xff0c;讲究的就是一个不差&#xff0c;…

javaScript蓝桥杯----回文字符串

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 有言曰&#xff1a;“回文诗&#xff0c;回复读之&#xff0c;皆歌而成文也”。回文诗&#xff0c;是使用词序回环往复的方式所成的诗&#xff0c;通俗来讲就是正读或者倒读都能成为诗句。历经数代诗人的创新&#xf…

chatgpt赋能python:Python取值:介绍

Python取值&#xff1a;介绍 Python是一种非常流行的高级编程语言&#xff0c;适用于各种任务&#xff0c;包括数据科学、机器学习、Web开发和自动化。它被广泛使用&#xff0c;因为它易于学习、易于使用、易于阅读和易于维护。Python中的取值对于程序员来说是一个极其有用的工…

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.6测评报告编制报送和监督检查

目录 测评报告管理要求 测评报告编制 测评报告审核 测评报告批准和签发 测评报告存档 测评报告更正 测评报告作废和销毁 保密要求 测评报告体例 测评相关信息报送 1.基本要求 ①测评报告的备案 ②被测信息系统密码应用数据的采集报送 2.测评信息的采集、报送 1&a…

RVOS环境搭建-01

RVOS环境搭建-01 背景介绍操作系统的定义操作系统的分类典型的 RTOS 介绍课程系统RVOS简介 Hello WorldQEMU介绍QEMU-virt 地址映射 系统引导引导程序要做哪些事情如何判断当前hart是不是第一个hart?如何初始化栈? 如何在屏幕输出Hello World通过串口输出UART特点UART的物理接…

无线通信技术

无线通信网包括面向语言通信的移动电话系统以及面向数据传输的无线局域网和无线广域网。 蜂窝通信系统&#xff1a; 1978年&#xff0c;美国贝尔实验室开发了高级移动电话系统&#xff08;AMPS&#xff09;。 AMPS采用模拟制式的频分双工&#xff08;FDD&#xff09;技术 第…

mysql数据类型有哪几种

Mysql支持的多种数据类型主要有&#xff1a;数值数据类型、日期/时间类型、字符串类型。 整数 浮点数&定点数 注&#xff1a;定点数以字符串形式存储&#xff0c;对精度要求高时使用decimal较好&#xff1b;尽量避免对浮点数进行减法和比较运算。 时间/日期类型 字符串类型…

Temporal.Duration 规范用法

后端突然告诉我返回给我的时间用了一个新的规范&#xff0c;我展示的时候突然发现这个规范蛮有意思&#xff0c;算是一个新的规范&#xff0c;展示到页面的时候也思考了很多&#xff0c;记录一下子~&#xff08;注&#xff1a;此 blog 主要目的仅是供自己记录&#xff0c;所以写…

chatgpt赋能python:Python取出列表中的某个数

Python取出列表中的某个数 在Python中&#xff0c;列表是一种非常重要的数据类型&#xff0c;它可以用来存储一系列有序的元素。在实际的开发中&#xff0c;经常会需要从列表中取出某个特定的数值&#xff0c;本文将介绍如何在Python中完成这个操作。 1. 使用index方法 Pyth…

AI实战营:MMPose开源算法库

RTMPose关键点检测全流程 MMPose预训练模型预测-命令行 预测单张图 # HRNet python .\demo\topdown_demo_with_mmdet.py .\demo\mmdetection_cfg\faster_rcnn_r50_fpn_coco.py https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faste…

chatgpt赋能python:Python反转语句:实用技巧提升编程能力

Python反转语句&#xff1a;实用技巧提升编程能力 Python是一门流行的编程语言&#xff0c;许多开发者都会选择Python作为主要的开发语言。其中一个原因是Python的语法简单易学&#xff0c;不仅适合初学者入门&#xff0c;也能被经验丰富的开发者用来构建复杂应用程序。在本文…

【网络原理】数据链路层 和 应用层 重点协议

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f340;一. 以太网协议&#xff08;数据链路层&#xff09;&#x1f33b;二. DNS &#xff08;应用层&#xff09;&#x1f33f;三. 网络原理知识面试总结 &#x1f34…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)

全方位渗透和探究SpringMVC的核心原理和运作机制 SpringMVC简介Spring Web MVC是什么Spring Web MVC的工作模式Spring Web MVC能帮我们做什么SpringMVC的底层依赖 SpringMVC工作流程SpringMVC中的组件DispatcherServlet前端控制器DispatcherServlet的职责和作用 HandlerMapping…

chatgpt赋能python:Python如何发送手机短信:实现方法解析和应用场景介绍

Python如何发送手机短信&#xff1a;实现方法解析和应用场景介绍 随着移动 App 的兴起&#xff0c;手机短信已成为现代人日常生活中不可或缺的一部分。在有些场景下需要编写 Python 程序去自动化发送短信&#xff0c;例如企业营销活动、警报系统等。本文将介绍 Python 发送短信…

chatgpt赋能python:Python可以搜集网上资料吗?

Python 可以搜集网上资料吗&#xff1f; Python 是一种非常流行的编程语言&#xff0c;它广泛应用于数据科学、机器学习、人工智能等领域。作为一名 Python 工程师&#xff0c;我们经常需要在互联网上搜集资料来解决开发中的问题&#xff0c;但是有些人会问&#xff1a;Python…

设计模式B站学习(一)(java)

这里写目录标题 一、设计模式概述1.1 软件设计模式的产生背景1.2 软件设计模式的概念1.3 学习设计模式的必要性1.4 设计模式分类 二、UML图2.1 类图概述2.2 类图的作用2.3 类图表示法2.3.1 类图表示方法2.3.2 类与类之间关系的表示方法2.3.2.1 关联关系2.3.2.2 聚合关系2.3.2.3…

C语言,指针详解

1. 指针是什么&#xff1f; 1. 指针是内存中一个最小单元的编号 2. 口头上的“指针”&#xff0c;指的是指针变量 #include<stdio.h>int main() {int a10;int * pa&a;// pa 是一个指针变量,用来存放 a 的地址//int ——> pa 所指向对象的类型//* 代表 pa是个指针…

【ros/ros2】ros2 humble镜像制作过程中碰到的问题记录

文章目录 序言1. 避免手动设置时区2. docker build中间某一步失败了3. sudo apt install ros-humble-desktop安装报错 E: Unable to locate package ros-humble-desktop4. 编译ros2 humnble时报错5. sudo rosdep init失败6. 下载依赖时失败&#xff1a;rosdep install --from-p…