当前位置: 首页 > 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 的时候。 无论是…...

SDD基于规范编程-OpenSpec及SuperPowers档

智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式,即所谓的“工程导向型”开发,要求开发者创建一个复杂的项目结构,包括项目文件(.csproj)、解决方案文件(.sln)、属性设置以及依赖…...

Qwen2.5多轮对话断裂?长上下文管理优化部署教程

Qwen2.5多轮对话断裂?长上下文管理优化部署教程 你是不是也遇到过这样的情况:用Qwen2.5模型进行多轮对话,聊着聊着,它好像就“失忆”了,不记得前面说过什么?或者当你输入一段很长的文档让它总结时&#xf…...

终极指南:如何高效使用Audio Slicer实现智能音频分割

终极指南:如何高效使用Audio Slicer实现智能音频分割 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer 你是否曾为处理长音频文件而烦恼&…...

Ansible AWX实战:5分钟搞定Web界面管理你的Playbook

Ansible AWX实战:5分钟极速部署与高效运维指南 当Ansible遇上AWX,运维效率将迎来质的飞跃。想象一下,原本需要在命令行反复敲击的Playbook,现在只需在浏览器中轻点几下就能完成编排、执行和监控——这正是AWX赋予运维团队的超能力…...

终极指南:如何在Chrome浏览器中免费实现KeePass密码自动填充

终极指南:如何在Chrome浏览器中免费实现KeePass密码自动填充 【免费下载链接】ChromeKeePass Chrome extensions for automatically filling credentials from KeePass/KeeWeb 项目地址: https://gitcode.com/gh_mirrors/ch/ChromeKeePass 你是否厌倦了每次登…...

万象视界灵坛入门必看:CLIP多模态原理通俗解读+像素界面操作逻辑映射

万象视界灵坛入门必看:CLIP多模态原理通俗解读像素界面操作逻辑映射 1. 什么是万象视界灵坛 万象视界灵坛是一款基于OpenAI CLIP技术的高级多模态智能感知平台。它将复杂的视觉识别技术转化为直观有趣的像素风格界面,让用户能够轻松探索图像与文本之间…...

SpaceClaim 流体域建模实战:从零到一构建CFD仿真几何

1. SpaceClaim流体域建模基础概念 第一次接触CFD仿真时,我完全被复杂的几何建模难住了。直到发现SpaceClaim这个神器,才明白原来流体域建模可以如此直观高效。SpaceClaim作为ANSYS旗下的直接建模工具,彻底改变了传统参数化建模的繁琐流程&am…...

现代AI系统架构全景解析

人工智能系统已从单一算法演进为复杂的多组件协作架构。本文将深入解析现代AI系统的核心构成要素——从大型语言模型(LLM)到智能体(Agent),从检索增强生成(RAG)到模型上下文协议(MCP…...

ComfyUI-Manager中SVD模型加载错误的深度解析与高效解决实战指南

ComfyUI-Manager中SVD模型加载错误的深度解析与高效解决实战指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom…...

如何用哔哩下载姬DownKyi轻松搞定B站视频下载:新手必备完整指南

如何用哔哩下载姬DownKyi轻松搞定B站视频下载:新手必备完整指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印…...

别再给 Token 续费了:你的 Agent 架构才是最大的“吞金兽”

在 LLM 应用开发的圈子里,有一种心照不宣的焦虑:看着 Claude 或 Codex 的账单,那种心脏骤停的感觉。每当有开发者在 Twitter 上抱怨“三天烧光月度额度”时,评论区的建议往往乏善可陈——要么换个更便宜的模型,要么就咬…...

如何用Dism++快速清理和优化Windows系统:免费工具完整指南

如何用Dism快速清理和优化Windows系统:免费工具完整指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism是一款强大的Windows系统维护工具&…...

告别繁琐安装!在线PPT制作神器PPTist,浏览器就能创作专业演示文稿

告别繁琐安装!在线PPT制作神器PPTist,浏览器就能创作专业演示文稿 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS P…...

Draw.io ECE终极指南:如何快速创建专业电路图(免费开源工具)

Draw.io ECE终极指南:如何快速创建专业电路图(免费开源工具) 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: h…...

如何快速上手cxmooc-tools:5分钟搞定三大网课平台自动刷课

如何快速上手cxmooc-tools:5分钟搞定三大网课平台自动刷课 【免费下载链接】cxmooc-tools 一个 超星(学习通)/智慧树(知到)/中国大学mooc 学习工具,火狐,谷歌,油猴支持.全自动任务,视频倍速秒过,作业考试题库,验证码自动打码(੧ᐛ੭挂科模式,启动) 项目地址: http…...

GLM-4.1V-9B-Base保姆级教程:上传图片提问,秒懂图片内容

GLM-4.1V-9B-Base保姆级教程:上传图片提问,秒懂图片内容 1. 模型介绍与核心能力 GLM-4.1V-9B-Base是智谱AI开源的一款视觉多模态理解模型,专注于图像内容识别和中文视觉问答任务。这个9B参数的模型在保持轻量化的同时,展现了出色…...

# 英伟达AI实验室财经分析报告(2026)

2026财年整体业绩 总营收:2159.38亿美元,同比增长65% 净利润:1200.67亿美元,同比增长65%,日均净赚约3.3亿美元 毛利率:稳定在75%的行业天花板水平,非GAAP毛利率达75.2% 市值:截至202…...

避坑指南:OpenSIPS 3.1在Docker下的5个常见配置错误(附NAT解决方案)

OpenSIPS 3.1容器化部署实战:5个关键配置陷阱与高效排错手册 当你第一次尝试在Docker中部署OpenSIPS 3.1时,是否遇到过容器正常启动却无法建立会话的情况?这就像在黑暗迷宫中摸索——明明每个转角都看似正确,却总在关键时刻碰壁。…...

别再为整层铜箔烦恼了!嘉立创EDA内电层局部优化技巧:电源分割与信号屏蔽实战

嘉立创EDA内电层高级优化:电源分割与信号屏蔽的工程实践 在高速电路设计中,电源分配网络(PDN)和信号完整性(SI)往往决定着整个系统的稳定性。传统四层板设计中,工程师习惯将中间两层分别设置为完整的VCC和GND平面,这种"整层铜…...

通达信【四季发财中线】指标实战指南:如何用紫色柱线精准捕捉短线买卖点

通达信四季发财中线指标实战解析:紫色柱线短线交易策略 在股票交易的世界里,技术指标如同航海中的罗盘,为投资者指引方向。通达信的四季发财中线指标因其多信号集成特性,成为许多中短线交易者的得力助手。这个指标最引人注目的特点…...

STC89C51与L298N驱动的超声波智能避障小车全流程开发指南

1. 项目概述与硬件选型 智能避障小车是嵌入式开发的经典练手项目,它能综合运用传感器技术、电机控制和实时数据处理等核心技能。这次我们要做的是一款基于STC89C51单片机L298N电机驱动HC-SR04超声波模块的智能小车,成本控制在200元以内,但功能…...

React Native Decompiler:解密打包代码的3个核心优势

React Native Decompiler:解密打包代码的3个核心优势 【免费下载链接】react-native-decompiler Decompile React Native bundles 项目地址: https://gitcode.com/gh_mirrors/rea/react-native-decompiler 你是否曾经面对React Native打包后的代码感到无从下…...

城通网盘直连解析终极方案:如何让下载效率提升300%的完整开源工具

城通网盘直连解析终极方案:如何让下载效率提升300%的完整开源工具 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 在数字资源分享领域,城通网盘凭借其免费存储空间吸引了大量用户…...

终极指南:10分钟掌握Bypass Paywalls Chrome Clean内容解锁神器

终极指南:10分钟掌握Bypass Paywalls Chrome Clean内容解锁神器 还在为付费墙烦恼吗?每年为各种新闻订阅花费数千元?今天我要分享一个能帮你省下这笔钱的实用工具——Bypass Paywalls Chrome Clean。这款浏览器扩展能够智能绕过各类网站的付费…...

RePKG:深度解析Wallpaper Engine资源提取与纹理转换的终极方案

RePKG:深度解析Wallpaper Engine资源提取与纹理转换的终极方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在Wallpaper Engine生态系统中,PKG文件提取和…...

3分钟解放双手:Midscene让AI帮你完成所有浏览器重复操作

3分钟解放双手:Midscene让AI帮你完成所有浏览器重复操作 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 厌倦了每天在浏览器中重复点击、填写、刷新&…...

BetterGI原神AI助手:300%效率提升的终极自动化游戏指南

BetterGI原神AI助手:300%效率提升的终极自动化游戏指南 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 - …...

FREE!ship Plus终极指南:免费开源船舶设计软件完整教程

FREE!ship Plus终极指南:免费开源船舶设计软件完整教程 【免费下载链接】freeship-plus-in-lazarus FreeShip Plus in Lazarus 项目地址: https://gitcode.com/gh_mirrors/fr/freeship-plus-in-lazarus 想要设计专业的船舶模型却苦于高昂的软件费用&#xff…...

Transformer+RoPE如何让GVHMR处理超长视频?深入解读Relative Transformer的设计与实现

TransformerRoPE如何让GVHMR处理超长视频?深入解读Relative Transformer的设计与实现 在计算机视觉领域,处理长序列视频数据一直是个棘手的问题。想象一下,当你需要分析一段长达数小时的监控视频或完整电影片段中的人体动作时,传统…...