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

从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具杖

我为什么会发出这个疑问呢是因为我研究Web开发中的一个问题时HTTP请求体在 Filter过滤器处被读取了之后在 Controller控制层就读不到值了使用 RequestBody 的时候。无论是字节流InputStream / OutputStream还是字符流Reader / Writer所有基于流的读取操作都会维护一个 位置指针。初始状态下指针指向流的起始位置position 0每次调用 read() / read(byte[]) / read(char[]) 等读取方法时指针会向后移动对应字节数当指针移动到流的末尾没有更多数据read() 方法会返回 -1表示流读取完毕指针移动后不会自动回退也无法反向移动除非流显式支持重置因此再次读取只能得到 -1。类比IO 流的读取过程就像用 磁带播放器听磁带 —— 磁头对应流的位置指针从磁带开头指针 0开始移动每读一个字节 / 字符磁头就往后走一步当磁头走到磁带末尾再继续播放读取就只能听到 沙沙声流返回 -1并且磁头不会自动回到开头。当然不是所有流都只能读一次基于内存的流如 ByteArrayInputStream / CharArrayReader支持重置指针因为它们的数据源是内存中的数组数据不会消失可以通过 mark() 和 reset() 方法将指针 恢复 到标记位置。需要注意调用 reset() 前必须先调用 mark(int readlimit)不是所有流都支持 mark() / reset()可以通过 inputStream.markSupported() 来进行判断。使用 mark() 和 reset() 方法// 仅适用于支持mark的流public void processWithMark(InputStream input) throws IOException {if (!input.markSupported()) {throw new IOException(Mark not supported);}// 标记当前位置参数100表示最多可回退100字节input.mark(100);// 第一次读取byte[] firstRead new byte[50];input.read(firstRead);System.out.println(First read: new String(firstRead));// 重置到标记位置input.reset();// 第二次读取相同内容byte[] secondRead new byte[50];input.read(secondRead);System.out.println(Second read: new String(secondRead));}使用 包装类 解决上文我们提到的 HTTP请求体多次读取 的问题public class MyRequestWrapper extends HttpServletRequestWrapper {private final byte[] body; // 缓存请求体的字节数组public MyRequestWrapper(HttpServletRequest request) throws IOException {super(request);// 关键步骤在构造时一次性读取并存储原始请求流body StreamUtils.copyToByteArray(request.getInputStream());}// 提供一个便捷方法用于在过滤器中获取请求体内容例如记录日志// 使用时直接调用 getBodyString() 即可public String getBodyString() throws UnsupportedEncodingException {return new String(body, this.getCharacterEncoding());}Overridepublic ServletInputStream getInputStream() throws IOException {// 每次调用都返回一个基于缓存数据的新流ByteArrayInputStream bais new ByteArrayInputStream(body);return new ServletInputStream() {Overridepublic int read() {return bais.read();}Overridepublic boolean isFinished() {return bais.available() 0;}Overridepublic boolean isReady() {return true;}Overridepublic void setReadListener(ReadListener readListener) {// 无需实现}};}Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream(), this.getCharacterEncoding()));}}然后在 过滤器 处包装请求Slf4jConfigurationpublic class RequestCachingFilterConfig {Beanpublic FilterRegistrationBean requestCachingFilter() {FilterRegistrationBean registrationBean new FilterRegistrationBean();// 核心创建过滤器包装请求为 ContentCachingRequestWrapperregistrationBean.setFilter(new OncePerRequestFilter() {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 1. 仅包装 HTTP 请求排除 WebSocket 等if (request instanceof HttpServletRequest !(request instanceof ContentCachingRequestWrapper)) {log.info(进入requestCachingFilter);// 2. 包装请求自动缓存请求体MyRequestWrapper wrappedRequest new MyRequestWrapper(request);filterChain.doFilter(wrappedRequest, response); // 传递包装后的请求} else {filterChain.doFilter(request, response); // 无需包装直接放行}}});// 3. 配置拦截所有请求可根据需求调整 URL 模式registrationBean.addUrlPatterns(/*);registrationBean.setOrder(1); // 优先级最高确保先于其他过滤器执行registrationBean.setName(requestCachingFilter);return registrationBean;}}IO 流只能读取一次是 精心设计的贴合操作系统文件 / 网络 IO 的 顺序消费 特性保持和底层系统的一致性。月衔炮锌

相关文章:

从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具杖

我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...

2025届必备的十大降AI率平台推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为了降低文本生成痕迹,针对知网AI检测系统的核心评估机制,要从语义连…...

桌面端 Claw 个人微信接入指南使

1.概述在人工智能快速发展的今天,AI不再仅仅是回答问题的聊天机器人,而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理,能够在用户的机器上安全高效地生成高质量的软件变…...

2025年项目管理工具深度评测:Gitee如何以“代码+管理“双核驱动重塑企业协作

数字化转型浪潮下,项目管理工具市场正迎来前所未有的变革。作为中国最大的代码托管平台,Gitee通过全面升级项目管理模块,在2025年的工具评测中展现出独特竞争力。本文将深入解析Gitee的核心优势、行业应用场景以及未来发展趋势,为…...

TwiLiquidCrystal库:HD44780 LCD的I²C裸机级驱动解析

1. TwiLiquidCrystal 库概述:面向嵌入式工程师的 HD44780 LCD IC 驱动深度解析TwiLiquidCrystal 是由开发者 Arnakazim 维护的一个轻量级、高兼容性的 Arduino 兼容库,专为通过 IC(在 AVR 平台常称 TWI)总线驱动 HD44780 及其兼容…...

2025—2030年全球CRM系统市场研究与趋势展望

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

实测CosyVoice零样本语音克隆:上传10秒音频,一键生成你的AI语音分身

实测CosyVoice零样本语音克隆:上传10秒音频,一键生成你的AI语音分身 你有没有想过,用自己的声音录制一段有声书,或者为你的视频创作一个专属的旁白配音?过去,这需要专业的录音设备和后期处理。但现在&…...

Linux文件系统原理与性能优化实战

1. 文件系统基础概念解析在Linux环境中,文件系统如同一个庞大的图书馆管理系统。它不仅负责书籍(文件)的存储,还要管理书架(目录)的结构、借阅记录(权限)以及图书的检索方式。与Wind…...

基于STM32与华为云IoT的智能衣柜开发实战

1. 项目概述这个智能衣柜项目基于STM32微控制器开发,通过华为云IoT平台实现远程监控与控制功能。作为一名嵌入式开发工程师,我最近完成了这个项目的原型开发,它能够实时监测衣柜内的温湿度、衣物存储状态,并通过手机APP进行远程管…...

彻底搞懂Autoresearch:Agent无人值守炼丹揭秘,看这一篇就够了!

Autoresearch 是一项完全由 AI 驱动的自主机器学习研究实验,由 Andrej Karpathy创建。其核心思想非常简单:赋予 Agent 一个真实可用的 GPT 训练环境,让其自主进行实验——修改代码、运行 5 分钟的短时训练、评估结果,并决定保留还…...

超流体真空理论:光速本质、微观粒子结构与量子纠缠拓扑机制

摘要本文基于超流体真空理论框架,揭示狭义相对论洛伦兹变换的物理本源,诠释光速不变的底层形成机制,明确微观基本粒子的真空结构起源;同时提出原创性量子纠缠拓扑结构模型,定义纠缠传态的速度极限与物理机制&#xff0…...

如何高效定制暗黑破坏神2角色?全能d2s存档编辑器使用指南

如何高效定制暗黑破坏神2角色?全能d2s存档编辑器使用指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 在暗黑破坏神2的冒险旅程中,你是否曾因属性点分配失误、稀有装备获取困难或存档损坏而感到沮丧&a…...

VinXiangQi:如何用计算机视觉技术打造终极中国象棋智能辅助系统

VinXiangQi:如何用计算机视觉技术打造终极中国象棋智能辅助系统 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 在数字化时代,传统…...

旧Hadoop和新Windows怎么搭 - Windows下编译Hadoop 3.2.1实战指南

老旧的hadoop 怎么编译部署到新版本的windows服务器上 网上是有不少现成的hadoop windows二进制文件的,但都是有特定的编译环境和相应的系统兼容范围的。总有那么一些时候,现成的不管用,我们得自己来稍作调整,然后自己编译。 本笔记是基于在 Windows 11 上为Windows Serv…...

基于单片机的自动存包柜设计

1. 系统总体设计 点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/91926418 1.1 设计背景 随着公共场所(如商场、车站、学校等)对自助服务需求的不断提升,自动存包柜逐渐成为智能化服务设施的…...

MySQL ER_IB_MSG_919报错解析,故障修复与远程处理指南

快速解决MySQL错误ER_IB_MSG_919 (MY-012744)的方法是备份数据文件,检查并修复表空间文件损坏,必要时使用innodb_force_recovery参数启动并导出数据重建数据库。 错误代码含义解析 ER_IB_MSG_919,对应内部错误代码MY-012744,是M…...

Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)比

从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...

从报告看懂安全隐患,提升防护能力

渗透测试报告不仅是“漏洞清单”,更是企业提升安全防护能力的“行动指南”。很多企业拿到报告后,只关注漏洞数量,却不知道如何解读隐患、落地整改,最终导致测试流于形式,安全风险依然存在。下面通俗拆解,教…...

实时行情系统设计:从协议选择到高可用架构,再到数据源选型计

一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过锁…...

Flutter 动画控制器:打造流畅的动画体验

Flutter 动画控制器:打造流畅的动画体验掌握 Flutter 动画控制器的高级技巧,创造流畅而优雅的动画效果。一、动画控制器概述 作为一名把代码当散文写的 UI 匠人,我对 Flutter 动画控制器有着独特的见解。动画控制器是 Flutter 动画系统的核心…...

和AI一起搞事情#:边剥龙虾边做个中医技能来起号酌

1. 核心概念 在 Antigravity 中,技能系统分为两层: Skills (全局库):实际的代码、脚本和指南,存储在系统级目录(如 ~/.gemini/antigravity/skills)。它们是“能力”的本体。 Workflows (项目级)&#xff1a…...

Windows系统运行Android应用的终极方案:APK Installer完全指南

Windows系统运行Android应用的终极方案:APK Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到这样的情况:想在W…...

大模型压力测试与负载测试的完整指南:从理论到实践干货分享

总的来说,大模型压力测试与负载测试是确保其在高并发、大数据量场景下稳定可靠运行的关键环节。核心结论是:压力测试旨在探索系统极限,发现性能瓶颈;负载测试则用于验证系统在预期工作负载下的表现。两者结合,才能为模…...

【毫米波混合波束成形】第9章 多用户MIMO与干扰抑制的深度学习

目录 第一部分:原理详解 第9章 多用户干扰对齐与联合收发设计 9.1 多用户干扰对齐的网络求解 9.1.1 和速率最大化与最小用户速率公平性 9.1.1.1 加权最小均方误差(WMMSE)的展开 9.1.1.1.1 WMMSE迭代中接收波束与发射波束的交替更新层设计…...

Pyfa:EVE Online舰船配置的离线解决方案

Pyfa:EVE Online舰船配置的离线解决方案 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa 在EVE Online的浩瀚宇宙中,舰船配置是决定战斗胜负的关…...

5个关键场景深度解析:为什么你需要这个免费的Windows自动点击器

5个关键场景深度解析:为什么你需要这个免费的Windows自动点击器 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker 在现代数字工作流程中&#xff…...

Token热潮下的低价骗局:数据安全谁来守护?

Token火爆背后:低价商品的疯狂蔓延2026年,Token成为科技圈热词,截至3月,我国日均词元调用量超140万亿,较2024年初增长1000多倍。‘龙虾’的火爆让Token走进大众视野,电商平台上低价Token商品随处可见&#…...

Go语言中的监控系统:从基础到高级

Go语言中的监控系统:从基础到高级 1. 引言 在生产环境中,监控是保证系统稳定运行的重要手段。通过监控,我们可以了解系统的运行状态、发现潜在问题、及时处理故障。Go语言生态中有丰富的监控工具和库,可以帮助开发者构建完善的监…...

Boost搜索引擎:正倒排索引实战解析

基于正倒排索引的Boost搜索引擎项目日志、Server代码及详解在本项目中,我们构建了一个高效的搜索引擎,使用正排索引和倒排索引技术,基于C和Boost库实现。正排索引存储文档ID到文档内容的映射,便于快速检索文档内容;倒排…...

vue el-table 切换页面、组件销毁会内存泄漏吗?99% 的人都误解了

el-table 切换页面、组件销毁会内存泄漏吗?99% 的人都误解了 前言 在 Vue 后台项目里,el-table 几乎是必用组件。 很多同学反馈:页面切走、组件销毁后,内存居高不下,怀疑 el-table 本身内存泄漏。 本文一次性讲清真相&…...