JAVA NIO组件之Buffer详解

news2024/11/14 15:25:25
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

在Java NIO(New I/O)中,Buffer是一个重要的组件,它作为数据的容器,主要用于数据的读写操作。Buffer本质上是一个内存块,可以写入数据,也可以从中读取数据。

Buffer的基本概念

Buffer是一个抽象类,对应于Java的主要数据类型,在NIO中有8种缓冲区类,分别是ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer和MappedByteBuffer。这些不同的Buffer子类对应于Java的主要数据类型,每种子类能操作的数据类型可以通过名称进行判断。

Buffer的主要类型

  • ByteBuffer:用于字节数据的读写。
  • CharBuffer:用于字符数据的读写。
  • DoubleBuffer:用于双精度浮点数数据的读写。
  • FloatBuffer:用于单精度浮点数数据的读写。
  • IntBuffer:用于整数数据的读写。
  • LongBuffer:用于长整数数据的读写。
  • ShortBuffer:用于短整数数据的读写。
  • MappedByteBuffer:用于映射文件区域的读写。

Buffer的关键属性

  • 容量(Capacity):表示Buffer的最大数据容量,一旦初始化就不能改变。
  • 位置(Position):表示下一个要被读或写的元素的索引。它的值由get( )和put( )函数自动更新。
  • 限制(Limit):表示第一个不应该读或写的元素的索引。在写模式下,limit等于Buffer的capacity;在读模式下,limit表示最多能从缓冲区中读取到多少数据。

Buffer中数据读写操作的基本流程

  1. 写入数据:通过调用Buffer的put( )方法向Buffer中写入数据。数据会被写入到position指针所指向的位置,并且position指针会向前移动。如果需要写入大量数据,可以使用Buffer的bulk put( )方法提高写入效率。

  2. 读取数据:通过调用Buffer的get( )方法从Buffer中读取数据。数据会被读取到position指针所指向的位置,并且position指针会向前移动。同样地,如果需要读取大量数据,可以使用Buffer的bulk get( )方法提高读取效率。

  3. 重置position:如果需要重新读取已读过的数据,可以使用mark( )方法设置一个标记,然后调用reset( )方法将position重置为mark的值。

  4. 清除Buffer:如果需要清除Buffer中的数据,可以使用clear( )方法将position和limit都设置为0,同时将capacity保持不变。如果需要将Buffer中的数据全部置为某个值,可以使用flip( )方法将limit设置为position之前的值,然后将position设置为0。

Java NIO Buffer相关类的使用示例

下面是一个使用ByteBuffer的示例,演示了如何向Buffer中写入数据并读取它们:

// 创建一个ByteBuffer对象,初始容量为10
ByteBuffer buffer = ByteBuffer.allocate(10);

// 写入数据
for (int i = 0; i < 5; i++) {
    buffer.put((byte) i);
}

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

// 读取数据
while (buffer.hasRemaining()) {
    byte b = buffer.get();
    System.out.print(b + " ");
}

在这个示例中,我们首先创建了一个容量为10的ByteBuffer对象。然后,通过调用put( )方法向Buffer中写入了5个字节的数据。接下来,调用flip( )方法将Buffer切换到读模式,并通过get( )方法从Buffer中读取数据,直到没有剩余数据为止。


关注公众号[码到三十五]获取更多技术干货 !

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

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

相关文章

标签-镜像拉取策略-重启策略-pod优雅终止-pod中容器资源限制-容器类型-容器守护进程-日志排错-容器命令exec-cp

一.标签 1.概述&#xff1a; 标签是附加到kubernets对象&#xff08;比如pod&#xff09;上的键值对&#xff0c;标签可以在创建时附加到对象&#xff0c;随后也可以随时添加修改&#xff1b;标签不支持唯一性。 在k8s中大多数资源都是通过标签进行关联的&#xff08;如pod与s…

管理Linux本地用户和组

什么是用户 用户账户在可以运行命令的不同人员和程序之间提供安全界限。 在Linux系统中&#xff0c;系统通过分配唯一的标识号&#xff08;用户ID或UID&#xff09;来区分不同的用户帐户。 在Linux系统中&#xff0c;用户帐户有以下三种主要类型&#xff1a; 超级用户 负责…

跨平台APP开发工具的选择

跨平台APP开发工具允许开发者编写一次代码,然后在多个平台上运行,如iOS、Android等,这极大地提高了开发效率并降低了维护成本。下面是一些流行的跨平台APP开发工具及其特点: React Native 开发公司:Facebook编程语言:JavaScript特点: 使用React的组件模型构建原生应用。…

无损音乐播放器推荐:Audirvana for Mac 中文激活版

udirvana 是一款高品质的音乐播放软件&#xff0c;专为Mac操作系统设计。它被设计来提供音频播放的最高标准&#xff0c;支持多种音频格式&#xff0c;包括高达32位/192kHz的高分辨率音频。Audirvana Plus 是其高级版本&#xff0c;提供了更多的功能和优化&#xff0c;例如音频…

stm32h743 NetXduo 实现http server CubeIDE+CubeMX

在这边要设置mpu的大小,要用到http server,mpu得设置的大一些 我是这么设置的,做一个参考 同样,在FLASH.ld里面也要对应修改,SECTIONS里增加.tcp_sec和 .nx_data两个区,我们用ram_d2区域去做网络,这个就是对应每个数据在d2区域的起点。 在CubeMX里,需要用到filex、dhc…

全栈智能家居系统设计方案:STM32+Linux+多协议(MQTT、Zigbee、Z-Wave)通信+云平台集成

1. 项目概述 随着物联网技术的快速发展,智能家居系统正在成为现代生活中不可或缺的一部分。本文介绍了一个基于STM32微控制器和Linux系统的智能家居解决方案,涵盖了硬件设计、软件架构、通信协议以及云平台集成等方面。 该系统具有以下特点: 采用STM32作为终端设备的控制核心…

【python学习】python标准库之正则表达式库re的定义、功能和函数,以及正则表达式的元字符和含义

引言 re 库是Python标准库的一部分&#xff0c;不需要额外安装。要使用 re 库&#xff0c;只需在代码中导入它 文章目录 引言一、re库的定义二、re 库中常用的功能和函数&#xff1a;2.1 搜索模式2.2 查找模式2.3 替换模式2.4 分割模式2.5 编译模式2.6 错误信息2.7 支持的模式2…

基础部分-变量

目录 1、一个程序就是一个世界&#xff0c;变量是程序的基本组成单位。 2、变量有三个基本要素&#xff1a;类型名称值 3、变量相当于内存中一个数据存储空间的表示 4、变量的使用步骤 &#xff08;先定义后使用&#xff09; 5、变量快速入门 6、格式化输出 7、程序中 号…

链接追踪系列-07.logstash安装json_lines插件

进入docker中的logstash 容器内&#xff1a; jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …

【Linux】进程控制的详细介绍

前言 在此之前&#xff0c;我们学过进程的概念&#xff0c;进程的状态&#xff0c;进程地址空间等一系列进程相关的问题。本章我们继续学习进程&#xff0c;我们要来学习一下进程的控制&#xff0c;关于进程等待&#xff0c;等问题。 目录 1.再次认识Fork函数1.1 fork()之后操…

什么是 Modbus协议?

一、网络中的协议是指什么&#xff1f; 网络协议是网络通信中至关重要的一部分&#xff0c;它定义了网络中两个或多个设备之间通信的规则、过程和格式。这些规则确保了计算机网络设备能够使用一种通用语言来传输和接收数据&#xff0c;而不管它们的设计、硬件或基础设施如何。…

MySQL-ubuntu环境下安装配置mysql

文章目录 什么是数据库&#xff1f;一、ubuntu环境下安装mysql二、配置mysql配置文件1.先登上root账号2.配置文件的修改show engines \G; mysql和mysqld数据库的基础操作登录mysql创建数据库显示当前数据库使用数据库创建表插入students表数据打印students表数据select * from …

【吊打面试官系列-ZooKeeper面试题】说说客户端注册 Watcher 实现?

大家好&#xff0c;我是锋哥。今天分享关于 【说说客户端注册 Watcher 实现&#xff1f; 】面试题&#xff0c;希望对大家有帮助&#xff1b; 说说客户端注册 Watcher 实现&#xff1f; 1、调用 getData()/getChildren()/exist()三个 API&#xff0c;传入 Watcher 对象 1000道…

数据结构(Java):树二叉树

目录 1、树型结构 1.1 树的概念 1.2 如何判断树与非树 1.3 树的相关概念 1.4 树的表示形式 1.4.1 孩子兄弟表示法 2、二叉树 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储 2.5 二叉树的遍历 1、树型结构 1.1 树的概念 树型结构是一种非线…

文本分类--NLP-AI(八)

文本分类任务 任务简介1.字符数值化方式1方式2 2.池化&#xff08;pooling&#xff09;3.全连接层4.归一化函数&#xff08;Sigmoid&#xff09;5.总结 从任务抽象新的技术点Embedding层池化层 任务简介 任务介绍&#xff1a; 字符串分类&#xff0c;根据一句话的含妈量&#…

air-conditioning

air-conditioning 空调机安装 实地测量&#xff1a; 测量宽度 测量高度 测试厚度 其他位置测量 根据实际绘图&#xff1a; 改进图&#xff0c;哈哈&#xff0c;让自己满意也让别人满意 1&#xff09;需要考虑安装位置&#xff0c;减少高空放置&#xff0c;放置高空掉落 2&#…

YOLOv5和LPRNet的车牌识别系统

车牌识别系统 YOLOv5和LPRNet的车牌识别系统结合了深度学习技术的先进车牌识别解决方案。该系统整合了YOLOv5目标检测框架和LPRNet文本识别模型 1. YOLOv5目标检测框架 YOLO是一种先进的目标检测算法&#xff0c;以其实时性能和高精度闻名。YOLOv5是在前几代基础上进行优化的…

Mac应用程序清理卸载工具:App Cleaner Uninstaller for Mac 中文版

App Cleaner Pro是一款Mac上非常好用的软件卸载工具&#xff0c;支持应用卸载、Widget卸载、浏览器插件卸载&#xff0c;支持拖拽卸载和列表卸载&#xff0c;能够非常干净的卸载应用&#xff0c;节省你的磁盘空间。App Cleaner Uninstaller Pro是一款深度清理和卸载的工具&…

Postman下载及使用说明

Postman使用说明 Postman是什么&#xff1f; ​ Postman是一款接口对接工具【接口测试工具】 接口&#xff08;前端接口&#xff09;是什么&#xff1f; ​ 前端发送的请求普遍被称为接口 ​ 通常有网页的uri参数格式json/key-value请求方式post/get响应请求的格式json 接…

uboot默认配置过程

uboot默认配置,对于6ull来说,在uboot源码目录下执行:make mx6ull_14x14_evk_defconfig 1、make mx6ull_14x14_evk_defconfig mx6ull_14x14_evk_defconfig文件是在uboot源码configs/目录下面 执行过程分析 HOSTCC:编译一些.c文件 HOSTLD:制作出scripts/kconfig/conf这个…