当前位置: 首页 > article >正文

《Java 100 天进阶之路》第23篇:缓冲区数据结构 ByteBuffer

第23篇缓冲区数据结构 ByteBuffer系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第22篇Java字符串简介 |➡️ 下一篇第24篇Java枚举类型 enum 用法待发布一、核心知识点Buffer 抽象类与子类ByteBuffer、CharBuffer、IntBuffer等ByteBuffer核心属性capacity、limit、position、mark核心方法put()、get()、flip()、rewind()、clear()、compact()直接缓冲区 vs 堆缓冲区NIONew I/O中的使用场景二、通俗讲解1分钟开心学1. 什么是 BufferBuffer是 Java NIO 中用于存储数据的容器可以理解为一块可以读写的内存区域并带有一套指针系统来管理读写位置。最常用的是ByteBuffer。2. 四个核心属性capacity容量创建后不可变。limit读写的极限位置。position下一个要读/写的位置索引。mark标记位置可用reset()返回。3. 两种模式写模式刚创建时position 0limit capacity往里面put数据。读模式调用flip()后limit position原写到的位置position 0然后get数据。生活类比缓冲区就像一个水池。capacity是水池总容量。你在水池里倒水写position是水面高度。倒完后你标记一下现在的水位flip然后开始从底部取水读。取水时不能超过之前的水位limit。4. 直接缓冲区 vs 堆缓冲区堆缓冲区allocate()内存分配在 JVM 堆上受 GC 管理数据拷贝到 native 内存时多一次复制。直接缓冲区allocateDirect()内存分配在系统本机内存native heap减少一次拷贝适合大文件、网络传输但分配和释放成本高。三、实操代码案例 场景说明场景使用ByteBuffer实现一个简单的“写数据 → 读数据”流程。importjava.nio.ByteBuffer;importjava.nio.charset.StandardCharsets;publicclassByteBufferDemo{publicstaticvoidmain(String[]args){// 1. 创建堆缓冲区容量10ByteBufferbufferByteBuffer.allocate(10);System.out.println(初始: posbuffer.position(), limitbuffer.limit());// 2. 写入数据buffer.put((byte)H);buffer.put((byte)i);buffer.put((byte)!);System.out.println(写入后: posbuffer.position());// 3// 3. 切换到读模式buffer.flip();System.out.println(flip后: posbuffer.position(), limitbuffer.limit());// pos0, limit3// 4. 读取数据while(buffer.hasRemaining()){System.out.print((char)buffer.get());}System.out.println();// 输出 Hi!// 5. rewind重新读buffer.rewind();System.out.println(rewind后 posbuffer.position());// 0// 6. clear清空状态准备重新写buffer.clear();System.out.println(clear后 posbuffer.position(), limitbuffer.limit());// pos0, limit10// 7. 直接缓冲区示例ByteBufferdirectBufByteBuffer.allocateDirect(1024);if(directBuf.isDirect()){System.out.println(这是直接缓冲区适合网络传输);}// 8. 字符串与 ByteBuffer 互转StringmsgHello NIO;ByteBufferbufByteBuffer.wrap(msg.getBytes(StandardCharsets.UTF_8));// 读取时byte[]bytesnewbyte[buf.remaining()];buf.get(bytes);StringdecodednewString(bytes,StandardCharsets.UTF_8);System.out.println(decoded);}}四、避坑要点错误/误区后果正确做法写入后忘记flip()直接读取读不到数据position 在末尾写后读前必须flip()flip()多次调用limit被错误设置只在切换模式时调用一次直接缓冲区频繁分配释放性能反而下降复用缓冲区或使用池化技术使用get()前不判断hasRemaining()可能抛出BufferUnderflowException先判断或捕获异常五、面试高频考点Q1ByteBuffer的flip()方法做了什么将limit设为当前positionposition归零为从写模式切换到读模式做准备。Q2直接缓冲区的优缺点优点减少 JVM 堆和 native 堆之间的数据拷贝提高 I/O 性能适合大文件、网络。缺点分配和释放成本高不受 JVM 堆大小限制但受物理内存限制。Q3clear()和compact()的区别clear()重置position0, limitcapacity丢弃未读数据compact()将未读数据复制到缓冲区头部position移到未读数据后limitcapacity为写入留出空间。六、练习题代码填空完成如下操作写入字符串 “Java” 的字节然后读取并打印。简答什么时候使用直接缓冲区什么时候使用堆缓冲区动手用ByteBuffer和FileChannel实现文件拷贝使用transferTo或read/write。 你的学习进度当前第23篇 / 共44篇 ·第三阶段字符串、Buffer、枚举、类加载第21~25篇✅ 已完成第1~22篇 正在学第23篇⏳ 待学习第24~44篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 本专栏每篇都包含避坑表 面试高频考点 练习题。每天30分钟100天拿offer下一篇文章预告《Java枚举类型 enum 用法》内容简介枚举的定义、构造器、成员变量和方法values()/valueOf()/ordinal()枚举单例模式。 学完这篇你将掌握枚举的全部用法并用枚举写出更安全的代码。《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送

相关文章:

《Java 100 天进阶之路》第23篇:缓冲区数据结构 ByteBuffer

第23篇:缓冲区数据结构 ByteBuffer 📌 系列导航:《Java 100 天进阶之路》完整目录 | ⬅️ 上一篇:第22篇:Java字符串简介 | ➡️ 下一篇:第24篇:Java枚举类型 enum 用法👈 待发布 一…...

免费Minecraft基岩版启动器终极指南:突破官方限制的完整解决方案

免费Minecraft基岩版启动器终极指南:突破官方限制的完整解决方案 【免费下载链接】BedrockLauncher 项目地址: https://gitcode.com/gh_mirrors/be/BedrockLauncher 还在为Minecraft基岩版官方启动器的功能限制而困扰吗?想要像Java版那样自由管理…...

硬件工程师的‘第一板’:从最小系统设计到PCB Layout的STM32实战指南

STM32最小系统设计实战:从原理到PCB的工程化思维 作为一名硬件工程师,第一次独立完成PCB设计时的忐忑至今记忆犹新。那块承载着STM32最小系统的绿色电路板,不仅是我职业生涯的"第一板",更是一次从理论到实践的完整跨越。…...

ThinkPad T480黑苹果终极方案:从硬件兼容到系统优化的完全手册

ThinkPad T480黑苹果终极方案:从硬件兼容到系统优化的完全手册 【免费下载链接】t480-oc 💻 Lenovo ThinkPad T480 / T580 / X280 Hackintosh (macOS Monterey 12.x - Sequoia 15.x) - OpenCore 项目地址: https://gitcode.com/gh_mirrors/t4/t480-oc …...

基于eNSP的园区网络高可用与安全隔离综合实验

1. 实验背景与核心价值 园区网络作为企业数字化转型的基础设施,其稳定性和安全性直接关系到日常运营效率。记得去年参与某金融机构网络改造项目时,他们的核心业务系统因为单点故障导致全网瘫痪4小时,直接损失超过百万。这个案例让我深刻认识到…...

不只是调色板:深入Cadence Allegro颜色配置文件的保存与复用逻辑(SPB17.4实战)

不只是调色板:深入Cadence Allegro颜色配置文件的保存与复用逻辑(SPB17.4实战) 在PCB设计领域,颜色配置往往被视为一种"视觉装饰"——直到某天你接手一个来自同事的工程文件,发现所有网络、层叠和元件都以难…...

libhv实战:手把手教你用C++写一个带自动重连的WebSocket客户端(附避坑指南)

libhv实战:构建高可靠WebSocket客户端的工程化实践 在实时数据采集和监控系统中,WebSocket客户端的稳定性直接决定了业务连续性。当网络出现闪断、服务端重启或负载波动时,简单的连接断开可能导致关键数据丢失。libhv作为高性能网络库&#x…...

3步完成Python界面设计:可视化拖拽工具完全指南

3步完成Python界面设计:可视化拖拽工具完全指南 【免费下载链接】tkinter-helper 为tkinter打造的可视化拖拽布局界面设计小工具 项目地址: https://gitcode.com/gh_mirrors/tk/tkinter-helper 还在为Python界面开发而烦恼吗?手动编写Tkinter代码…...

从“白点”到模型:用通俗语言拆解玻纤布(如1078)在SI仿真中的正确建模姿势

从“白点”到模型:信号完整性仿真中的玻纤布建模实战指南 在高速PCB设计领域,信号完整性(SI)工程师常常需要面对一个看似微小却影响深远的问题:那些在显微镜下呈现为"白点"的玻璃纤维束,究竟应该…...

CanFestival实战:从心跳、TPDO/RPDO配置到回调函数的完整链路解析

1. CanFestival协议栈基础认知 第一次接触CanFestival时,我也被各种专业术语搞得晕头转向。简单来说,它就是个开源的CANopen协议栈实现,专门用于嵌入式设备间的通信。就像两个说同一种方言的人能顺畅交流一样,CanFestival让不同厂…...

免费跨平台绘图神器:draw.io桌面版终极使用指南

免费跨平台绘图神器:draw.io桌面版终极使用指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为不同系统间的图表文件兼容性而烦恼吗?&#x1f91…...

轻量级AI工具库aiclublight:从零解析微型深度学习框架的设计与实现

1. 项目概述:一个轻量级AI工具库的诞生最近在GitHub上闲逛,发现了一个挺有意思的项目,叫aiclublight,作者是Dimks777。光看名字,大概就能猜到,这应该是一个和人工智能俱乐部或者AI相关的、主打轻量化的工具…...

开源机械爪OpenClaw UBI:从3D打印到Arduino控制的低成本机器人抓取方案

1. 项目概述:一个基于开源硬件的机械爪设计与实现最近在整理工作室的物料时,翻出了几个闲置的步进电机和一堆3D打印件,这让我想起了几年前一个挺有意思的项目——OpenClaw UBI。这是一个在开源硬件社区里流传的、基于通用构建接口&#xff08…...

开源机器人夹爪任务控制台:架构设计与工程实践全解析

1. 项目概述:从“OpenClaw 任务控制”看开源机器人控制台的演进最近在机器人开发社区里,一个名为abhi1693/openclaw-mission-control的项目引起了我的注意。乍一看这个标题,你可能会联想到科幻电影里那些布满屏幕、控制着庞大机械臂的指挥中心…...

Mastra框架全解析:构建AI应用的全栈开发实践

1. 项目概述:一个面向AI应用开发的“全栈式”框架最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:如何把大语言模型(LLM)的能力,稳定、高效、低成本地集成到自己的产品里。从调用API、管理对话状态、…...

AI Native Web 开发实战:从零构建智能应用

AI Native Web 产品实战指南:从概念到落地的完整路线做了大半年 AI 应用开发之后,我发现一个现象:很多人知道 “AI Native” 这个词,但真要动手做一个 AI Native 的 Web 产品,脑子里是一团浆糊的。这篇文章就是想把这块…...

3步解锁12种加密音乐:免费开源工具让数字音乐重获自由

3步解锁12种加密音乐:免费开源工具让数字音乐重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https…...

【限时技术白皮书】ElevenLabs尼泊尔文语音质量评估体系(含MOS打分标准、基线数据集、及与Google Cloud Text-to-Speech Nepali v1.3对比)

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs尼泊尔文语音质量评估体系概述 ElevenLabs 对尼泊尔文(नेपाली)语音合成的支持虽属新兴能力,但其质量评估需兼顾语言学特性、声学保真度与文化适配性…...

FanControl风扇控制技术深度解析:Windows系统兼容性优化与高级温控实战指南

FanControl风扇控制技术深度解析:Windows系统兼容性优化与高级温控实战指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.co…...

【限时技术白皮书】ElevenLabs希伯来文语音工程手册(v2.3.1):含BERT-Heb分词器适配补丁、ta’amei ha-miqra韵律注入模块及CI/CD集成脚本

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs希伯来文语音工程概览 ElevenLabs 作为前沿的文本转语音(TTS)平台,自2023年起逐步扩展对希伯来语(Hebrew)的支持,涵盖音…...

DMA+PWM驱动SK6812 RGB灯带:从时序解析到STM32高效实现

1. SK6812灯带时序解析:为什么PWMDMA是绝配 第一次接触SK6812这类智能RGB灯带时,我被它的控制方式惊艳到了——只需要一根数据线就能串联控制数百个灯珠。但真正动手实现时,才发现时序控制才是真正的挑战。SK6812的通信协议本质上是通过特定时…...

i.MX6Q高温满负载压力测试:从散热原理到嵌入式产品可靠性设计

1. 项目概述与测试背景 在嵌入式产品的研发过程中,尤其是在工业控制、车载电子、户外设备等严苛应用场景下,系统的长期稳定性和可靠性是衡量产品成败的关键。其中,处理器作为系统的“大脑”,其在高负载、高温环境下的表现&#xf…...

网易云音乐增强脚本架构解析:基于用户脚本技术的云音乐生态扩展方案

网易云音乐增强脚本架构解析:基于用户脚本技术的云音乐生态扩展方案 【免费下载链接】myuserscripts 网易云音乐油猴脚本:歌曲下载、转存云盘、云盘歌曲快传、云盘匹配纠正... 项目地址: https://gitcode.com/gh_mirrors/my/myuserscripts 项目愿景与价值主张…...

企业级AI助手私有化部署:Open WebUI完全指南

企业级AI助手私有化部署:Open WebUI完全指南 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui 在数据安全和隐私保护日益重要的今天,企…...

Whisky停止维护后,如何在M系列Mac上继续运行Windows应用?5种技术实现路径深度解析

Whisky停止维护后,如何在M系列Mac上继续运行Windows应用?5种技术实现路径深度解析 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 当看到Whisky项目官方宣布&…...

FakeLocation深度探索:安卓应用级位置伪装的三层架构解析

FakeLocation深度探索:安卓应用级位置伪装的三层架构解析 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在数字时代,位置数据已成为个人隐私的敏感边界。…...

声明式工作流编排框架:从计划到执行的自动化实践

1. 项目概述:从“计划清单”到“框架”的蜕变如果你和我一样,在职业生涯中经历过从零到一构建复杂应用,或者维护过多个技术栈各异、需求多变的项目,那你一定对“计划”和“清单”这两个词深有感触。我们每天都在做计划&#xff0c…...

对比按需计费与Token Plan套餐在长期项目中的成本体感

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比按需计费与Token Plan套餐在长期项目中的成本体感 1. 项目背景与初始计费模式 我们团队维护着一个面向内部的知识库问答应用&…...

arXiv论文源码怎么复用?手把手教你用Overleaf导入、编译与二次创作

arXiv论文源码复用指南:Overleaf导入、编译与二次创作全解析 当你从arXiv下载了一篇论文的LaTeX源码压缩包,却发现本地环境配置复杂、依赖缺失或路径错误导致编译失败时,这篇文章将成为你的救星。我们将以Overleaf为工具,深入解决…...

Taotoken 用量看板如何帮助团队清晰追踪与优化 API 调用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 用量看板如何帮助团队清晰追踪与优化 API 调用成本 对于依赖大模型 API 进行开发的团队而言,成本控制与资源分…...