Java NIO Buffer

Buffer是一块内存,主要用在NIO Channel,比如FileChannel,SocketChannel。

对Channel的读写都是直接操作Buffer对象。

Buffer是一个工具类,提供了操作这个内存块的方法。

Buffer的实现主要有以下几种:

Buffer的类型:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

Buffer基本使用

四步搞定

  • 写数据到Buffer中
  • 调用buffer.flip()
  • 从buffer中读取数据
  • 调用buffer.clear()或者buffer.compact()

buffer主要有四个主要属性:

  • capacity: Buffer最大容量
  • position:读写偏移
  • limit:最大可读容量
  • mark: 标记,可以调用reset重读或重写

只要理解了这四个属性,基本就掌握了Buffer的使用和原理。

我们来看下这三个属性的说明:

position和limit依赖于Buffer处于读模式还是写模式,capacity的意义在读模式和写模式都是一样的

  • 1 capacity:Buffer的最大容量

  • 2 position位置:写模式下:初始值为0,比如当你put(),putXXX()时,position累加,position最大值是capacity-1

读模式下:调用Buffer.flip从写模式切换到读模式,position被重置为0,其他与写模式的偏移累加一致

  • 3 limit:写模式下:limit的值与capacity一致

读模式下:limit用来标志你能够读取多少数据,意思就是你只能读取写入的position数据。

  • 4 mark:重置读写偏移

读写可以参考下图:

写模式下,posistion累加,limit和capacity不变,即可以写入的最大字数。

每次调用一次put()或者putXXXX()时,position+n(n为你写入的字数,如果写入一个字,则position+1,如果你写入字数组,position+数组.长度)

读模式:当调用flip()时,将limit设置为position,position设置为0,mark设置为-1,limit为能够读取的最大字数。

每调用一次get或者getXXX()时,position+n(n为你读取的字数,如果读取一个字,则position+1,如果你读取字数组,position+数组.长度)

Capacity在读模式和写模式下都不变。

Buffer.clear()和Buffer.compact()

读取完数据后,如果想要Buffer能够再次写入,可以调用clear和compact函数。

如果调用clear函数,position设置为0.limit设置为capacity,其实里面的数据并没有被清除,只是覆盖写。

但是有一个场景是,数据没有读取完成之前,你需要要先写入一些数据时,可以调用compact函数,这个函数会把没有读取完的数据拷贝到Buffer开始处,然后把position设置为n(n为未读取数据的长度),limit设置为capacity。

下面是一个简单的Demo:

// 基本使用
// 新建一个缓冲区,可以存放10个整数
IntBuffer intBuffer = IntBuffer.allocate(10);

// 没有元素的时候,注意:get的内容int为0,你有可能put 0,所以可以判断一下position
// 调用intBuffer.position()
// 否则get 会让position+1
System.out.println("current position should be 0, actually: " + intBuffer.position());
if (intBuffer.position() > 0) {
    int empty_get = intBuffer.get();
}

// 连续放入10个元素
intBuffer.put(1);
intBuffer.put(2);
intBuffer.put(3);
intBuffer.put(4);
intBuffer.put(5);
intBuffer.put(6);
intBuffer.put(7);
intBuffer.put(8);
intBuffer.put(9);
intBuffer.put(10);

// 放入第11个元素时会溢出
try {
    intBuffer.put(11);
} catch (BufferOverflowException e) {
    System.out.println("here should be overflow");
    e.printStackTrace();
}

// 写模式切换到读模式
intBuffer.flip();

// 从buffer中读取数据
int one = intBuffer.get();
System.out.println("read from IntBuffer: should be 1, actually: " + one);
// 重定向读取位置为0
intBuffer.rewind();
one = intBuffer.get();
System.out.println("read from IntBuffer: should be 1, actually: " + one);

//intBuffer.get(new int[9]);

// 读模式切换到写模式
// 将position设置为0, limit设置为capacity
// 如果不想继续读取未被读取的数据,intBuffer.clear();
intBuffer.compact();

intBuffer.put(11);

intBuffer.flip();

// 读取第一个元素,应该是2
int two = intBuffer.get();
System.out.println("read from IntBuffer: should be 2, actually: " + two);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我一个普通程序员,光靠GitHub打赏就年入70万,

一个国外程序员名叫 Caleb Porzio在网上公开了自己用GitHub打赏年入70万的消息和具体做法。 Caleb Porzio 发推庆祝自己靠 GitHub 打赏(GitHub Sponsors)赚到了 10 万美元。 GitHub Sponsors是 GitHub 2019 年 5 月份推出的一个功能,允许开发…

ConvMixer:Patches Are All You Need

Patches Are All You Need 发表时间:[Submitted on 24 Jan 2022]; 发表期刊/会议:Computer Vision and Pattern Recognition; 论文地址:https://arxiv.org/abs/2201.09792; 代码地址:https:…

Redis 主从库如何实现数据一致?

目录 1、主从库间如何进行第一次同步? 2、主从级联模式分担全量复制时的主库压力 3、主从库间网络断了怎么办? 总结 // 好的文章,值得反复去读 Redis 具有高可靠性,这里有两层含义:一是数据尽量少丢失,…

【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

SpringBoot:SpringBoot 的底层运行原理解析

声明原文出处:狂神说 文章目录1. pom.xml1 . 父依赖2 . 启动器 spring-boot-starter2. 主启动类的注解1. 默认的主启动类2. SpringBootApplication3. ComponentScan4. SpringBootConfiguration5. SpringBootApplication 注解6. spring.factories7. 结论8. 简单图解3…

【Python】如何使用Pandas进行数据可视化?

如何使用Pandas进行数据可视化?1. 如何创建简单图?1.1 创建线型图1.2 绘制直方图1.3 绘制条形图1.4 绘制饼图1.5 绘制散点图2. Plot方法有哪些?3. 如何定制图表的样式和颜色?4. 如何同时对多个DataFrame绘图?5. 总结参…

K8s运维-高级网络策略介绍

1什么是NetworkPolicy?如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。NetworkPolicy 是一种以应用为中心的…

【1615. 最大网络秩】

来源:力扣(LeetCode) 描述: n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。 两座不同城市构成的 城市对 的 网络秩 定义为&#xff…

从0到1构建springboot web应用镜像并使用容器部署

文章目录一、生成镜像的两种方法1.1、使用commit生成镜像1.1.1、拉取Centos基础镜像1.1.2、启动Centos容器并安装Go1.1.3、commit生成新镜像1.1.4、使用新镜像验证Golang环境1.2、使用Dockerfile生成镜像二、基于Dockerfile生成一个springboot镜像2.1、准备springboot应用jar包…

python自动化办公(一)

本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数,常用前4个,除了file参数外,其他参数都有默认值。file指定了要打开的文件名称&a…

FreeRTOS系列第1篇---为什么选择FreeRTOS?

1.为什么学习RTOS? 作为基于ARM7、Cortex-M3硬件开发的嵌入式工程师,我一直反对使用RTOS。不仅因为不恰当的使用RTOS会给项目带来额外的稳定性风险,更重要的是我认为绝大多数基于ARM7、Cortex-M3硬件的项目,还没复杂到使用RTOS的地…

【华为机试真题详解 Python实现】最差产品奖【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…

SpringBoot和Spring AOP默认动态代理方式

SpringBoot和Spring AOP默认动态代理方式 目录SpringBoot和Spring AOP默认动态代理方式1. springboot 2.x 及以上版本2. Springboot 1.x3.SpringBoot 2.x 为何默认使用 CglibSpring 5.x中AOP默认依旧使用JDK动态代理SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可…

做技术,最忌讳东张西望

又好长时间没更新,研二了,忙着做实验、写论文、发论文,再加上给我导做一些事情(都习惯了,以前很不爽的事情,现在居然能这么平静的说出来)。 但这不是我今天说的重点,而是另外一件事…

【开发工具】idea配置全局变量Jdk、maven仓库、maven(全文图解)

文章目录IDEA配置JDK1、点击File -->Project Structure;2、点击左侧标签页SDKs选项,再点击左上角“”,选择JDK;3、在弹出框选择JDK安装路径,点击OK即可配置成功。配置maven仓库(阿里云)1、配…

素材要VIP咋整?看python大展神通

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 再我们缺少素材的时候,我们第一反应 我们肯定会去网上寻找,但是!! 有的素材需要VIP!这可咋整呢? 看我利用python大展神通,采集某图网图片…

面试官:关于CPU你了解多少?

CPU是如何执行程序的? 程序执行的基本过程 第一步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准…

Altium Designer(AD)软件使用记录11-PCB布线部分之走线

目录Altium Designer(AD)软件使用记录11-PCB布线部分之走线核心-SDRAM-FLASH 模块走线BGA 滤波电容放置处理其他杂线走线清理Altium Designer(AD)软件使用记录11-PCB布线部分之走线 核心-SDRAM-FLASH 模块走线 走线总结: 走线从核心器件部分,线路密度最…

Java——二叉树的最近公共祖先及二叉搜索树介绍

目录 二叉树的最近公共祖先 题目 思路一:如果给定的是一颗二叉搜索树, 思路二:假设是孩子双亲表示法 二叉搜索树 定义Node类 查找 删除 插入 二叉树的最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百…

OpenCV入门(十一)快速学会OpenCV 10 形态学操作

OpenCV入门(十一)快速学会OpenCV 10 形态学操作 作者:Xiou 形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。 形态学主要从图像内提取分量信息&#…