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

【NIO番外篇】之组件 Buffer

在这里插入图片描述

目录

    • 一、Buffer:数据界的“快递小哥”/“临时仓库管理员” 😉
      • 什么是 Buffer?
      • 它的作用是什么?
    • 二、Buffer 的“三围”和“书签”📌:核心属性
      • 1. Capacity (容量):
      • 2. Position (位置):
      • 3. Limit (限制):
      • 4. Mark (标记):
    • 三、Buffer 的“七十二变”🎭:核心方法
    • 四、常用的 Buffer 种类
      • 上代码!边看边乐 🎬
    • 五、总结一下 Buffer 的人生哲学

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 Redis主从复制 请看 : Redis主从复制:告别单身Redis!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

客官! Java NIO Buffer 豪华幽默详解套餐来了!坐稳了,咱们这就发车 🚀,去看看这个在 NIO 世界里搬砖(搬数据)的劳模 —— Buffer!

一、Buffer:数据界的“快递小哥”/“临时仓库管理员” 😉

了解Java NIO的 Channel 组件请看:【NIO番外篇】之组件 Channel

想象一下,你(Java 应用程序)要和外面的世界(比如文件、网络连接,也就是 NIO 里的 Channel)进行大量的数据交换。直接一个字节一个字节地吼,效率太低,嗓子也受不了(系统开销大 😫)。这时候,Buffer 这位“快递小哥”就闪亮登场了!✨

什么是 Buffer?

简单说,Buffer 就是内存里的一块 固定大小 的区域,专门用来 临时存储 数据。它就像一个容量有限的 快递车厢 🚚 或者 仓库里的托盘 📦。数据要么从 Channel “装货”到 Buffer,要么从 Buffer “卸货”到 Channel。你也可以直接往 Buffer 里放东西 (put) 或者从里面取东西 (get)。

它的作用是什么?

  1. 提高效率:老式的 IO 是流式(Stream-based)的,一次可能只处理一个字节,慢吞吞🐢。NIO 和 Buffer 允许我们一次性处理一块数据(一个 Buffer 的量),减少了系统调用次数,就像快递小哥一次送一车货,而不是一件一件跑腿,效率大大滴提高了!👍
  2. 数据中转站:它是 Channel 和你的应用程序之间数据传输的 必经之路。数据必须先读入 Buffer,然后你才能处理;或者你先把数据写入 Buffer,然后才能通过 Channel 发送出去。Buffer 在中间扮演了“接驳员”的角色 🤝。
  3. 方便数据操作:Buffer 提供了一套精密的 API 来操作这块内存,让你能精确地控制读写位置、数据范围等。

二、Buffer 的“三围”和“书签”📌:核心属性

每个 Buffer 都像一个有严格规矩的仓库管理员,时刻关注着这四个核心指标:

1. Capacity (容量):

  • 含义:Buffer 能容纳的最大数据量(元素的数量)。一旦创建,容量就固定不变了。
  • 理解:快递车厢的总容积,或者仓库托盘的最大承重。定了多大就是多大,不能超载 🚫,也不能临时扩容(除非你换个更大的车/托盘)。
  • 方法capacity()

2. Position (位置):

  • 含义:下一个要被读取写入的元素的索引。初始值为 0。
  • 理解:快递小哥当前正在操作(装货/卸货)的那个包裹的位置 👇。写数据 (put) 时,它指向下一个空位;读数据 (get) 时,它指向下一个要取的包裹。putget 一次,position 就自动往后挪一个位置。➡️
  • 方法position() / position(int newPosition)

3. Limit (限制):

  • 含义:表示 Buffer 中有效内容的界限。
    • 写模式下:Limit 等于 Capacity,表示你最多能写到哪里。
    • 读模式下:Limit 等于之前写模式下的 position,表示你最多能读到哪里(也就是实际有多少数据可读)。
  • 理解
    • 写模式:仓库管理员划定的“货物堆放区”的最大边界(不能超过这个边界放货 ✋)。
    • 读模式:仓库管理员告诉你:“嘿,这批货实际上只装到了这里(Limit),后面的区域是空的或者还没整理好,你别过去取了!” 🤔
  • 方法limit() / limit(int newLimit)

4. Mark (标记):

  • 含义:一个备忘录位置。你可以通过 mark() 方法在当前 position 做个标记,之后可以通过 reset() 方法将 position 恢复到这个标记的位置。初始时 Mark 是未定义的(通常是 -1)。
  • 理解:快递小哥在某个包裹上贴了个“稍后回来处理”的便利贴 (mark())📝。后来他忙完别的事,看到便利贴,就立刻回到那个包裹的位置 (reset())。↩️

记住这个重要的关系:0 <= mark <= position <= limit <= capacity (就像套娃一样,一层套一层 🧸)。

三、Buffer 的“七十二变”🎭:核心方法

Buffer 的操作就像一套组合拳,最常用的有:

  1. allocate(int capacity) / allocateDirect(int capacity) (ByteBuffer 专属)

    • 作用:创建 Buffer。“喂!给我来个能装 capacity 个货的空车/托盘!” 🙋‍♂️
    • allocate: 在 JVM 堆内存中分配,受 GC 管理。普通青年。
    • allocateDirect: 在堆外(本地内存)分配,不受 GC 管理(但关联对象被回收时会释放),可能更快,因为操作系统可以直接操作这块内存,减少拷贝。文艺青年 😎,有点小资,分配和销毁成本高点。
    • 初始状态position = 0, limit = capacity, mark = -1
  2. put(...)

    • 作用:往 Buffer 里放数据。“装货!装货!” 📥
    • 有多种重载形式,可以放单个元素,也可以放一个数组。
    • 每放一个元素,position 就加 1。如果 position 追上 limit 了,再 put 就会抛出 BufferOverflowException(车厢满了!装不下了!🈵)。
  3. get(...)

    • 作用:从 Buffer 里取数据。“卸货!卸货!” 📤
    • 也有多种重载形式。
    • 每取一个元素,position 就加 1。如果 position 追上 limit 了,再 get 就会抛出 BufferUnderflowException(货都卸完了!没货了!🤷‍♀️)。
  4. flip() (翻转,核心!核心!核心!🤯)

    • 作用从写模式切换到读模式。“装满货(或者写到一定程度)了,准备开始卸货!”
    • 内部操作
      • limit = position; (把当前写到的位置设为读取的上限)
      • position = 0; (把读取的起始位置拨回 0)
      • mark = -1; (标记作废)
    • 理解:快递小哥装完货,大手一挥:“搞定!总共装了 position 件货。现在把装货清单(Limit)更新为 position,然后把卸货点(Position)挪回第一件货,准备开卸!” 这是最容易让人懵圈的操作,但也是 Buffer 的精髓所在!💡
  5. rewind() (倒带)

    • 作用重新读取 Buffer 中的数据。“刚才卸的货没看清,倒回去再看一遍!” ⏪
    • 内部操作
      • position = 0; (把读取位置拨回 0)
      • mark = -1; (标记作废)
    • limit 保持不变。通常在 flip() 之后,读了一部分或全部数据后使用,可以让你从头再读一遍。
  6. clear() (清空…但只是看起来像 🧹)

    • 作用从读模式切换回写模式,准备重新写入。“这车货卸完了(或者不关心剩下的了),把车厢打扫干净(指针归位),准备装下一批!”
    • 内部操作
      • position = 0;
      • limit = capacity;
      • mark = -1;
    • 注意clear() 并不会真的清除 Buffer 中的数据!它只是把 positionlimit 指针恢复到初始状态,表示这个 Buffer 现在可以从头开始写了。之前的数据还在那里,但除非你读它们,否则它们会被后续写入的数据覆盖。就像快递小哥只是把计数器归零,车厢里可能还有上次剩下的包装纸 🤫。
  7. compact() (压缩)

    • 作用:把未读的数据(从 positionlimit 之间的数据)挪到 Buffer 的开头,然后把 position 设置到最后一个未读元素的后面,limit 设置为 capacity。这样就可以在后面继续写入新的数据了。“把车厢里剩下的几件货往前挪挪,腾出后面的空间继续装新货!” 💪
    • 场景:当你读取了 Buffer 中的一部分数据,但又想继续往 Buffer 里写,而不是完全 clear() 时使用。
  8. mark() & reset()

    • mark(): 在当前的 position 打个标记。“在这做个记号!” 📍
    • reset(): 把 position 恢复到之前 mark() 的位置。“回到刚才做记号的地方!” ↪️ 如果之前没调用过 mark() 或者 mark 因为 flip()rewind() 被清除了,调用 reset() 会抛 InvalidMarkException

四、常用的 Buffer 种类

主要是针对 Java 的基本数据类型:

  • ByteBuffer: 最常用!劳模中的劳模 🏆。处理字节数据,网络和文件 IO 的主力军。它可以是直接的(Direct)或非直接的(Heap)。
  • CharBuffer: 处理字符数据。
  • ShortBuffer: 处理短整型数据。
  • IntBuffer: 处理整型数据。
  • LongBuffer: 处理长整型数据。
  • FloatBuffer: 处理单精度浮点数。
  • DoubleBuffer: 处理双精度浮点数。

除了 ByteBufferallocateDirect,其他类型的 Buffer 通常通过 ByteBufferasCharBuffer(), asIntBuffer() 等方法创建,它们共享 ByteBuffer 底层的字节数据,只是提供了不同类型的“视图”(View Buffer)👀。

上代码!边看边乐 🎬

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;public class BufferFunTime {public static void main(String[] args) {System.out.println("Buffer 喜剧小剧场开演!🎉");// === 第一幕:申请个新“车厢” ===// 申请一个容量为 10 字节的 ByteBuffer (堆内)ByteBuffer buffer = ByteBuffer.allocate(10);printBufferState("1. 新车厢已就位 (allocate) 🚚", buffer); // pos=0, lim=10, cap=10// === 第二幕:往车厢里装货 (put) ===String message = "Hi!";buffer.put(message.getBytes(StandardCharsets.UTF_8));printBufferState("2. 装入 'Hi!' (put) 📥", buffer); // pos=3, lim=10, cap=10// === 第三幕:准备卸货!翻转!(flip) ===// 从写模式切换到读模式buffer.flip();printBufferState("3. 翻转!准备卸货 (flip) ✨", buffer); // pos=0, lim=3, cap=10// === 第四幕:开始卸货 (get) ===System.out.print("4. 卸货中 (get) 📤: ");while (buffer.hasRemaining()) { // hasRemaining() 检查 position < limitSystem.out.print((char) buffer.get()); // 读一个字节,position++}System.out.println();printBufferState("   卸货完毕 👍", buffer); // pos=3, lim=3, cap=10// === 第五幕:想再看一遍?倒带!(rewind) ===buffer.rewind();printBufferState("5. 倒带,准备重读 (rewind) ⏪", buffer); // pos=0, lim=3, cap=10System.out.print("   重新读取: ");while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}System.out.println();printBufferState("   重读完毕 ✅", buffer); // pos=3, lim=3, cap=10// === 第六幕:打扫车厢,准备装新货 (clear) ===// 注意:数据其实还在,只是指针重置了buffer.clear();printBufferState("6. 打扫车厢 (clear) 🧹", buffer); // pos=0, lim=10, cap=10// 验证 clear 只是重置指针,数据可能还在System.out.println("   偷偷看一眼第一个字节 (它还在! 👀): " + (char)buffer.get(0)); // 使用绝对位置get,不改变position// === 第七幕:装新货,但这次车厢有点特殊 (compact 演示) ===buffer.clear(); // 先清空buffer.put("Hello".getBytes(StandardCharsets.UTF_8)); // 写入 "Hello" (5 字节)printBufferState("7a. 写入 'Hello'", buffer); // pos=5, lim=10, cap=10buffer.flip(); // 准备读printBufferState("7b. 翻转准备读 'Hello'", buffer); // pos=0, lim=5, cap=10// 只读前两个字节 'He'System.out.print("   只读 'He': ");System.out.print((char) buffer.get());System.out.print((char) buffer.get());System.out.println();printBufferState("   读完 'He'", buffer); // pos=2, lim=5, cap=10// 现在想继续往 Buffer 写,但又不想丢掉 'llo'// 使用 compact 把 'llo' 挪到前面buffer.compact();printBufferState("7c. 压缩 (compact) 💪", buffer); // pos=3, lim=10, cap=10// 解释: 'llo' (3字节)被移到 0,1,2 位置。position 设为 3,limit 设为 10.// 验证 'llo' 在前面System.out.println("   压缩后第一个字节 (是 'l'): " + (char)buffer.get(0));// 现在可以继续写入了,比如写入 " World" (6 字节)buffer.put(" World".getBytes(StandardCharsets.UTF_8));printBufferState("7d. 在压缩后写入 ' World'", buffer); // pos=9, lim=10, cap=10// 最后读出完整结果 "llo World"buffer.flip();printBufferState("7e. 翻转准备读 'llo World'", buffer); // pos=0, lim=9, cap=10System.out.print("   最终结果: ");while(buffer.hasRemaining()) {System.out.print((char)buffer.get());}System.out.println();printBufferState("   最终读取完毕🏁", buffer); // pos=9, lim=9, cap=10System.out.println("\nBuffer 喜剧小剧场落幕!鼓掌!👏👏");}// 辅助方法,打印 Buffer 的状态,方便观察private static void printBufferState(String action, ByteBuffer buffer) {System.out.printf("   Action: %-30s | pos=%-2d lim=%-2d cap=%-2d%n", // 稍微加宽 action 字段action, buffer.position(), buffer.limit(), buffer.capacity());}
}

运行这段代码,仔细观察每一步操作后 position, limit, capacity 的变化,就能深刻理解 Buffer 的工作机制了!🧐

五、总结一下 Buffer 的人生哲学

  • 容量天注定(Capacity 固定)。
  • 读写靠指针(Position 移动)。
  • 边界要看清(Limit 控制范围)。
  • 模式切换靠翻转(flip() 是关键 ✨)。
  • 想重来可倒带(rewind() ⏪)。
  • 要复用得“清场”(clear() 重置指针 🧹)。
  • 腾空间有妙招(compact() 移动未读数据 💪)。

希望这个充满“槽点”、比喻和表情包😂的讲解,能让你彻底搞懂 Java NIO Buffer 这个有点绕但非常重要的家伙!下次再遇到它,就可以拍拍它的“肩膀”说:“Buffer 老兄,你的套路我懂了!😎”

相关文章:

【NIO番外篇】之组件 Buffer

目录 一、Buffer&#xff1a;数据界的“快递小哥”/“临时仓库管理员” &#x1f609;什么是 Buffer&#xff1f;它的作用是什么&#xff1f; 二、Buffer 的“三围”和“书签”&#x1f4cc;&#xff1a;核心属性1. Capacity (容量)&#xff1a;2. Position (位置)&#xff1a;…...

Python基础知识(一、基础语法)

Python基础知识&#xff08;一、基础语法&#xff09; 字面量注释单行注释多行注释 变量数据类型数据类型查看数据类型转换 标识符命名规范不可使用关键字 运算符算数运算符赋值运算符 字符串字符串的定义方式字符串拼接占位拼接数字精度控制快速格式化 数据输入逻辑运算比较运…...

C语言题目自增在前与在后

一、题目引入 谨记真言: i的值最终都会改变 只是表达式的值不同 二、分析题目 if判断语句里面要条件为真执行时 printf语句 i 变量在前 使用i的当前值是1 i的值就是1与1相等 所以&&左边的为真 但是&&存在 必须前后都为真才为真 所以还要看&&后面…...

【口腔粘膜鳞状细胞癌】文献阅读

写在前面 看看文章&#xff0c;看看有没有思路 文献 The regulatory role of cancer stem cell marker gene CXCR4 in the growth and metastasis of gastric cancer IF:6.8 中科院分区:1区 医学WOS分区: Q1 目的&#xff1a;通过 scRNA-seq 结合大量 RNA-seq 揭示癌症干细胞…...

如何撤回刚提交的 commit

如何撤回刚提交的 commit 如果刚刚执行了 git commit 但想撤销这个提交&#xff0c;有几种方法可以实现&#xff0c;具体取决于你想达到的效果&#xff1a; 1. 撤销 commit 但保留更改&#xff08;修改回到暂存区&#xff09; git reset --soft HEAD~1这会撤销最后一次提交提…...

deepin使用autokey添加微信快捷键一键显隐ctrl+alt+w

打开deepin商店&#xff0c;搜索快捷键&#xff0c;找到autokey 快捷键管理&#xff0c;点击安装 点击右键新建文件夹 点击右键新建脚本 打开脚本并添加以下内容 import subprocess import time# ------------------ 配置项 ------------------ WM_CLASS "wechat…...

开源微调混合推理模型:cogito-v1-preview-qwen-32B

一、模型概述 1.1 模型特点 Cogito v1-preview-qwen-32B 是一款基于指令微调的生成式语言模型&#xff08;LLM&#xff09;&#xff0c;具有以下特点&#xff1a; 支持直接回答&#xff08;标准模式&#xff09;和自我反思后再回答&#xff08;推理模式&#xff09;。使用 I…...

【uniapp-兼容性处理】swiper在iOS上偶发出现后几张图片白屏情况

【日期】2025-04-14 【问题】 swiper在iOS上偶发出现后几张图片白屏情况 swiper内部的几个swiper-item垂直排列&#xff0c;各自进行滚动&#xff0c;样式方面兼容性出现问题 【原因】&#xff1a; 原代码&#xff1a;&#xff08;不应在swiper-item添加style属性&#xf…...

go中new和make有什么异同?

相同点&#xff1a;都是给变量分配内存 不同点&#xff1a; 作用类型不同。new通常给int、string、数组类型的变量分配内存&#xff0c;而make通常给slice、map、channel分配内存。返回值类型不同。new返回指向变量的指针&#xff0c;make返回的是变量本身new分配内存空间后&…...

RabbitMQ 深度解析:从基础到高级应用的全面指南

&#x1f430; RabbitMQ 深度解析&#xff1a;从基础到高级应用的全面指南 前言&#x1f4d8; 一、RabbitMQ 简介⚙️ 二、核心特性可靠性 &#x1f512;灵活路由 &#x1f504;高可用性 &#x1f310;多协议支持 &#x1f30d;多语言客户端 &#x1f4bb;插件机制 &#x1f50…...

动手强化学习之马尔可夫决策(机器人篇)

1 马尔可夫决策过程 马尔可夫决策过程&#xff08;Markov Decision Process, MDP&#xff09;是一种数学框架&#xff0c;用于建模智能体&#xff08;agent&#xff09;在随机环境中做决策的问题。它假设环境的状态转换具有马尔可夫性质&#xff0c;即未来的状态只依赖于当前状…...

【RabbitMQ】核心概念和工作流程

文章目录 RabbitMQ 工作流程流程图 Producer 和 ConsumerConnecting 和 ChannelVirtual hostQueueExchangeRabbitMQ 工作流程 RabbitMQ 工作流程 流程图 RabbitMQ 就是一个生产者/消费者模型 Producer 就是生产者、Consumer 就是消费者Broker 是 RabbitMQ 服务器生产者和消费…...

Windows 操作系统 - Windows 10 磁盘管理无法为 C 盘选择扩展卷

Windows 10 磁盘管理无法为 C 盘选择扩展卷 在 Windows 10 的磁盘管理中&#xff0c;无法为 C 盘选择扩展卷&#xff08;选项灰色不可用&#xff09;&#xff0c;主要原因是未分配空间没有紧邻 C 盘的右侧 补充&#xff1a;Windows 10 磁盘管理打开方式 1. 按下快捷键【Win …...

数据结构——双向链表

首先我们要介绍一下链表的分类 链表的分类 链表说明&#xff1a; 虽然有这么多种链表结构&#xff0c;但是我们实际中用的还是两种结构&#xff1a;单链表&#xff08;单向不带头不循环&#xff09;和 双向带头循环链表 。 单链表&#xff08;单向不带头不循环&#xff09;&…...

Git报错remote: Verify fatal: Authentication failed for ***

解决 Git 拉取代码时报错&#xff1a;fatal: Authentication failed 在使用 Git 时&#xff0c;执行如下命令&#xff1a; git pull origin master出现报错&#xff1a; remote: Verify fatal: Authentication failed for ***一、问题原因分析 1. 使用 HTTP 协议访问&#…...

八、自动化函数

1.元素的定位 web自动化测试的操作核心是能够找到页面对应的元素&#xff0c;然后才能对元素进行具体的操作。 常见的元素定位方式非常多&#xff0c;如id,classname,tagname,xpath,cssSelector 常用的主要由cssSelector和xpath 1.1 cssSelector选择器 选择器的功能&#x…...

websoket 学习笔记

目录 基本概念 工作原理 优势 应用场景 HTTP协议与 webSoket协议之间的对比 消息推送场景 1. 轮询&#xff08;Polling&#xff09; 2. 长轮询&#xff08;Long Polling&#xff09; 3. 服务器发送事件&#xff08;Server-Sent Events, SSE&#xff09; 4. WebSocket…...

正版金币捕鱼海洋管家APP源码结构解析与运行环境说明

这是一款基于成熟运营逻辑开发的休闲类互动娱乐游戏《海洋管家》&#xff0c;采用金币流通体系&#xff0c;双端源码完整&#xff0c;结构清晰&#xff0c;适合用于结构学习、本地部署测试或功能参考。 整体玩法围绕捕鱼为主线&#xff0c;并融合了排行榜、VIP、签到、道具商城…...

大语言模型深度思考与交互增强

总则&#xff1a;深度智能交互的全面升级 在主流大语言模型&#xff08;LLM&#xff09;与用户的每一次交互中&#xff0c;模型需于回应或调用工具前&#xff0c;展开深度、自然且无过滤的思考进程。当模型判断思考有助于提升回复质量时&#xff0c;必须即时进行全方位的思考与…...

Vue.js 项目中 vue.config.js 常用配置项解析

Vue.js 项目中 vue.config.js 常用配置项解析 摘要 在 Vue CLI 创建的项目中&#xff0c;vue.config.js 是核心配置文件&#xff0c;用于定制化构建、开发和部署流程。本文详细解析了该文件的常用配置项&#xff0c;包括基础路径、开发服务器、Webpack 配置、CSS 预处理、插件…...

Javascript逗号操作符

这段代码是一个使用了生成器函数&#xff08;Generator Function&#xff09;的无限循环&#xff08;for (;;)&#xff09;&#xff0c;内部通过switch语句控制流程。代码中有很多逗号分隔的语句&#xff0c;这其实是利用了JavaScript的逗号操作符&#xff08;comma operator&a…...

windows系统安装驱动、cuda和cudnn

一、首先在自己的电脑里安装了nvidia的独立显卡 显卡的查找方式&#xff1a; CtrlShiftEsc打开任务管理器&#xff0c;点击性能&#xff0c;点击GPU 0查看显卡型号&#xff0c;如下图所示&#xff1a; 只要电脑中有nvidia的独立显卡&#xff0c;就可以暗转显卡驱动、cuda和cu…...

常见的 14 个 HTTP 状态码详解

文章目录 一、2xx 成功1、200 OK2、204 No Content3、206 Partial Content 二、3xx 重定向1、301 Moved Permanently2、302 Found3、303 See Other注意4、Not Modified5、307 Temporary Redirect 三、4xx 客户端错误1、400 Bad Request2、401 Unauthorized3、403 Forbidden4、4…...

DAY 44 leetcode 28--字符串.实现strStr()

题号28 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 我的解法 双指针&#xff0c;slow定位&…...

Nginx用途以及好处:

反向代理&#xff1a; 1、提高访问速度 2、进行负载均衡&#xff1a;所谓负载均衡&#xff0c;就是把大量的请求按照我们指定的的方式均衡的分配给集群中的每台服务器(不使用nginx前端会固定的访问某一台服务器 加入nginx分配到多台服务器) 3、保证后端的安全 服务器一般部署在…...

打造可控可测的星座网络:IPLOOK低轨通信仿真平台搭建实践

在低轨卫星通信迅猛发展的趋势下&#xff0c;空天地一体化网络正逐步成为新一代信息基础设施的核心组成。作为移动核心网领域的技术引领者&#xff0c;IPLOOK依托在5G核心网、NTN&#xff08;非地面网络&#xff09;和卫星通信仿真方面的技术优势&#xff0c;率先构建了自主可控…...

火车头采集动态加载Ajax数据(无分页瀑布流网站)

为了先填充好数据在上线&#xff0c;在本地搭建了一个网站&#xff0c;并用火车头采集数据填充到里面。 开始很上手&#xff0c;因为找的网站的分类中是有分页的。很快捷的找到页面标识。 但是问题来了&#xff0c;如今很多网站都是采用的Ajax加载数据&#xff0c;根本没有分…...

笔记:代码随想录算法训练营day67:Floyd 算法精讲、A * 算法精讲 (A star算法) 严重超时完结,不过,撒花

学习资料&#xff1a;代码随想录 Floyd 算法精讲 卡码网&#xff1a;97. 小明逛公园 首先明确floyd算法解决的是多源最短路径问题&#xff0c;对边的权的正负值没有要求&#xff0c;而且是动态规划的思想 五部曲&#xff1a; 定义&#xff1a;grid[i][j][k]表示从i出发到j…...

Electron Forge【实战】桌面应用 —— AI聊天(中)

系列教程 Electron Forge【实战】桌面应用 —— AI聊天&#xff08;上&#xff09; 添加本地存储 Dexie.js 用 IndexedDB 实现&#xff0c;Dexie.js 库简化操作 npm i dexie新建文件 src\db.ts import Dexie, { type EntityTable } from "dexie";import { Provide…...

国达陶瓷重磅推出陶瓷罗马柱外墙整装尖端新产品“冠岩臻石”

近日&#xff0c;记者在佛山国达建材有限公司&#xff08;以下简称国达陶瓷&#xff09;董事长杨建平处了解到&#xff0c;该公司重磅推出的“冠岩臻石”新产品&#xff0c;是属于陶瓷罗马柱外墙整装产品中的尖端产品。新产品自面市之后&#xff0c;深受高端用户的青睐与认可。…...

Java 系统设计:如何应对高并发场景?

Java 系统设计&#xff1a;如何应对高并发场景&#xff1f; 在现代互联网应用中&#xff0c;高并发场景已经成为系统设计中不可避免的挑战。无论是电商秒杀、抢票系统&#xff0c;还是实时数据处理平台&#xff0c;高并发场景都对系统的性能、稳定性和扩展性提出了极高的要求。…...

VR 全景多维赋能,众趣科技助力零售业开启购物新时代

说到商铺这个词&#xff0c;最早形成于春秋战国时期&#xff0c;当时还未形成固定位置的商铺&#xff0c;部分有远见的商人会在人流量较大的区域摆设摊位&#xff0c;促进了城市的繁荣‌。‌到了唐宋时期&#xff0c;商铺进一步发展‌&#xff0c;并随着商品经济的发展和城市人…...

五大生产模式(MTS、MTO、ATO、ETO、CTO)的差异

五大生产模式&#xff08;MTS、MTO、ATO、ETO、CTO&#xff09;差异 一、 库存控制二、 订货提前期三、交期与库存分析四、五大生产模式的产品生命周期 一、 库存控制 ETO 模式侧重于原材料库存管理&#xff0c;以应对定制设计所需的物料供应。 MTO 模式重点是原材料库存&…...

clickhosue中json字符串转为表

将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 -- 将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 WITH -- 解析 JSON 数据为字符串json_data AS (SELECT [{"c…...

二叉树的基本功能实现

一.二叉树的结构及实现 1.二叉树的结构 在之前的章节中已经介绍过&#xff0c;二叉树是一种特殊的树&#xff0c;其最大度为2&#xff0c;及最多有左&#xff0c;右两个孩子&#xff0c;结构图如下 在此之前已经讨论过一些特殊的二叉树&#xff0c;这里讨论一般的二叉树 2.…...

VSCode 降低适用版本并且关闭自动更新

VSCode 降低适用版本并且关闭自动更新 相关链接问题描述解决方法下载安装包关闭自动更新 参考链接 相关链接 VSCode 官网 问题描述 无法正常使用vscode-remote插件远程连接Centos7等一些老版本Linux云服务器&#xff08;如Centos7&#xff09; 从2024年1月&#xff0c;vsco…...

OpenHarmony - 小型系统内核(LiteOS-A)(二)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;二&#xff09; 三、基础内核 3.1、中断及异常处理 基本概念 中断是指出现需要时&#xff0c;CPU暂停执行当前程序&#xff0c;转而执行新程序的过程。即在程序运行过程中&#xff0c;出现了一个必须…...

2025第十六届蓝桥杯PythonA组部分题解

试题A&#xff1a;数字求和 题目描述 给定两个整数a和b&#xff0c;输出它们的和。 输入格式&#xff1a;两个整数&#xff0c;空格分隔 输出格式&#xff1a;一个整数 输入输出样例 输入&#xff1a; 5 8输出&#xff1a; 13解题思路 直接使用加法运算符计算两数之和。…...

苍穹外卖day04

Spring Task实现定时处理订单状态 作用&#xff1a;不需要输入提示信号&#xff0c;便可定时自动执行程序 使用步骤 1、启动类上加上注解&#xff08;EnableScheduling&#xff09;开启定时任务调度 2、专门创建一个包来管理执行定时任务的类&#xff0c;该类需要交给IOC容…...

曲线与曲面的绘制

一、学习目标 &#xff08;1&#xff09;掌握常用规则参数曲线与曲面的编程绘制方法。 &#xff08;2&#xff09;掌握自由曲线与曲面的编程绘制方法。 &#xff08;3&#xff09;了解自由曲面的拼接编程方法。 二、学习内容 &#xff08;1&#xff09;编程绘一个规则参数…...

Python Cookbook-6.2 定义常量

任务 你需要定义一些模块级别的变量(比如命名的常量)&#xff0c;而且客户代码无法将其重新绑定。 解决方案 你可以把任何对象当做模块一样安装。将下列代码存为一个模块const.py&#xff0c;并放入你的Python的sys.path 指定的目录中: class _const(object):class ConstEr…...

【信息系统项目管理师】高分论文:论信息系统项目的范围管理(信息化系统综合管理平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划范围管理2、收集需求3、定义范围4、创建WBS5、确认范围6、控制范围论文 2017年6月,我作为项目经理参与了 XX市经济和信息化委员会系统综合管理平台建设项目,该项目投资共150万元人民币,建设工期…...

用Webpack 基础配置快速搭建项目开发环境

Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具&#xff0c;但是Webpack有大量的配置项&#xff0c;对新手不太友好&#xff0c;但是我们可以根据webpack-cli的init命令根据项目需求快速生成webpack的配置文件&#xff0c;本文将手把手教你如何用 Webpack 和 npm 快…...

【LLM Agent】SystemMessage 和 HumanMessage

文章目录 SystemMessage 和 HumanMessageSystemMessage&#xff08;系统消息&#xff09;HumanMessage&#xff08;用户消息&#xff09;结合使用高级设置能否将用户消息&#xff08;HumanMessage&#xff09;写在系统消息&#xff08;SystemMessage&#xff09; SystemMessage…...

机器学习核心知识:从基础概念到关键算法

摘要 本文深度剖析机器学习知识体系&#xff0c;从基本概念、学习方式&#xff0c;到分类算法、逻辑回归等关键内容均有涉及。详细阐述各知识点原理与应用场景&#xff0c;并对比多种算法的优劣。 关键词&#xff1a;机器学习&#xff1b;监督学习&#xff1b;分类算法&#x…...

信奥赛之c++基础(for与if的嵌套使用)

🍭 糖果工厂大闯关——for与if的嵌套魔法 🚚 第一章:快递站的故事(情景引入) 📦 快递分拣员小明 快递站每天要处理100个包裹,小明发现: 有些包裹要立即派送(红色标签)有些包裹可以暂存仓库(蓝色标签)for (int 包裹号=1; 包裹号<=100; 包裹号++) {if (包裹颜…...

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日&#xff0c;备受瞩目的QCon开发者技术峰会盛大举行&#xff0c;本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题&#xff0c;汇聚了众多鸿蒙生态的领军人物与技术专家&#xff0c;共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…...

day25 学习笔记

文章目录 前言一、图像翻转二、图像的仿射变换1.仿射变换的原理2.仿射变换函数3.图像旋转4.图像平移5.图像缩放6.图像剪切 三、插值方法1.最近领插值2.双线性插值法3.双三次插值4.代码展示 前言 通过今天的学习&#xff0c;我掌握了OpenCV中有关图像翻转&#xff0c;图像仿射变…...

Docker构建go-web应用

https://www.liwenzhou.com/posts/Go/deploy-in-docker/#c-0-4-0 本文介绍了如何使用Docker以及Docker Compose部署我们的 Go Web 程序。 Docker部署示例 准备代码 这里我先用一段使用net/http库编写的简单代码为例讲解如何使用Docker进行部署&#xff0c;后面再讲解稍微复杂…...

人工智能100问☞第4问:人工智能与机器学习、深度学习的区别?

目录 一、通俗解释 二、专业解析 三、权威参考 人工智能(AI)是目标​​:让机器具备智能(如建造一辆车);机器学习(ML)是引擎​​:提供动力方法(如燃油发动机);深度学习(DL)是涡轮增压​​:提升引擎性能(如处理复杂路况)。三者协同驱动技术发展,如同车辆需要…...