javaNIO -- ByteBuffer 原理机制

这篇具有很好参考价值的文章主要介绍了javaNIO -- ByteBuffer 原理机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

  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 等于容量。

javaNIO -- ByteBuffer 原理机制

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

javaNIO -- ByteBuffer 原理机制

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

javaNIO -- ByteBuffer 原理机制

  1. clear 动作发生后:

    javaNIO -- ByteBuffer 原理机制

ByteBuffer 方法

clear

切换为写模式。

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

javaNIO -- ByteBuffer 原理机制

flip

切换为读模式。

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

javaNIO -- ByteBuffer 原理机制

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 操作。

javaNIO -- ByteBuffer 原理机制

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()等方法的使用和区别 - 峰的季节 - 博客园文章来源地址https://www.toymoban.com/news/detail-470485.html

到了这里,关于javaNIO -- ByteBuffer 原理机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java.nio.ByteBuffer 学习笔记

    目录 java 重复使用bytebuffer例子: java验证flip函数: flip讲解 以下内容转自: java.nio.ByteBuffer https://www.cnblogs.com/chdf/p/11466522.html java.nio.ByteBuffer 1. ByteBuffer中的参数position、limit、capacity、mark含义: position:表示当前指针的位置(下一个要操作的数据元素的位置) limit:表示当前数组

    2024年02月10日
    浏览(34)
  • java nio中的ByteBuffer扩展

    在jdk1.4之前对于输入输出只能使用InPutStream和outPutSream这类传统io模型,在jdk1.4之后新增了nio,什么是nio?nio是new input/output 的简称,nio的效率要比传统io效率高,主要原因就是nio利用了系统底层的零拷贝技术和多路复用技术。 NIO有三个核心概念 1、Channal通道 2、Buffer缓冲 3、Se

    2023年04月16日
    浏览(25)
  • 深入理解网络 I/O:FileOutputStream、BufferFileOutputStream、ByteBuffer

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:网络 I/O 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您想

    2024年02月04日
    浏览(24)
  • Stable Diffusion原理说明

    本文参考:深入浅出讲解Stable Diffusion原理,新手也能看明白 - 知乎 目录 1、Stable Diffusion能做什么? 2、扩散模型(Diffusion model) (1)前向扩散(Forward Diffusion) (2)反向扩散(Reverse Diffusion) (3)如何训练  3、Stable Diffusion Model (1)潜在扩散模型(Latent diffusion model) (

    2024年02月11日
    浏览(31)
  • 从零开始学习Netty - 学习笔记 - NIO基础 - ByteBuffer: 简介和基本操作

    1.1. Channel Buffer Channel 在Java NIO(New I/O)中,“Channel”(通道)是一个重要的概念,用于 在非阻塞I/O操作中进行数据的传输 。Java NIO提供了一种更为灵活和高效的I/O处理方式,相比于传统的I/O,它具有更好的性能和可扩展性。 常见的Java NIO中的通道类型: FileChannel(文件通道

    2024年02月20日
    浏览(36)
  • arcgis中坡向计算工作原理说明

    用于识别出从每个像元到其相邻像元方向上值的变化率最大的下坡方向。坡向可以被视为坡度方向。输出栅格中各像元的值可指示出各像元位置处表面的朝向的罗盘方向。将按照顺时针方向进行测量,角度范围介于 0(正北)到 360(仍是正北)之间,即完整的圆。不具有下坡

    2024年04月23日
    浏览(21)
  • CRC32校验算法原理及计算说明

    本文主要介绍如何使用CRC32校验算法计算得出FCS(Frame Check Sequence帧检验序列). 参考: 1、CRC32加密算法原理 2、CRC多项式对应代码 作用:在远距离数据通信中,为确保高效而无差错地传送数据,对数据进行校验即差错控制。 CRC原理实际上就是在一个K位二进制数据序列之后附

    2023年04月22日
    浏览(34)
  • 举例说明单层神经网络的工作原理

    假设我们有一个简单的单层神经网络,用于解决一个简单的问题:根据一个人的年龄(x)来预测其收入(y)。在这个例子中,输入数据只有一个特征(年龄),因此我们可以用一个一维输入向量x来表示。输出结果y也是一个一维向量。 单层神经网络的结构如下: 1. 输入层:

    2024年02月16日
    浏览(43)
  • MobileNetV2原理说明及实践落地

    本文参考: 轻量级网络——MobileNetV2_Clichong的博客-CSDN博客_mobilenetv2 MobileNetV1主要是提出了可分离卷积的概念,大大减少了模型的参数个数,从而缩小了计算量。但是在CenterNet算法中作为BackBone效果并不佳,模型收敛效果不好导致目标检测的准确率不高。 MobileNetV2在MobileNetV1的

    2024年02月08日
    浏览(29)
  • 确认应答机制与超时重发机制【TCP原理(笔记一)】

    在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK(ACK(Positive Acknowled-gement)意指已经接收。) )。 确认应答机制的基本原理 发送方将数据分割成称为TCP段(TCP segment)的较小单元,并为每个段分配一个唯一的

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包