Java HttpServletRequest Body读一次就没了?原理与稳定提取方案
简介本资源是一份面向Java Web开发者的实用技术文档聚焦解决HTTP POST请求中无法通过常规getParameter()方法获取无名Body内容的核心痛点适用于Spring MVC、Servlet等传统Web框架下的接口调试与参数解析场景。资源以PDF格式提供共1个文件大小仅38KB轻量易读内容涵盖getInputStream()流式读取原理、BufferedReaderIOUtils.read()标准实现代码、关键注意事项如getParameter()调用顺序导致Body流失效的陷阱及真实Servlet示例含日志记录与JSON数据接收逻辑。文中特别强调了生产环境中的典型错误规避策略和参数协同处理方案可直接用于接口层Body解析模块开发与排错。目前已有34465人学习下载是Java后端工程师快速掌握POST Body读取底层机制的高复用参考材料。1. Java里HttpServletRequest的body为什么“读一次就没了”POST请求体内容获取的底层陷阱与稳定提取方案你写了个Spring Boot接口用RequestBody能正常拿到JSON但某天想在Filter里提前读一遍原始body做日志或鉴权一调request.getInputStream().read()——后面Controller里的RequestBody就报空指针或400错误。不是代码写错了是HttpServletRequest的body流被提前消费了且Servlet规范明确禁止重复读取。这个问题在网关日志、统一签名验签、敏感词扫描、流量回放等场景高频出现尤其当项目从单体转向微服务后Filter/Interceptor层对原始body的强依赖陡增。本文不讲RequestBody怎么用那是Spring的事只聚焦原生Servlet API下如何在不破坏后续处理链的前提下安全、可复用、零副作用地获取POST请求的body原始字节。适合所有需要在Filter、Servlet、自定义Handler中操作原始HTTP body的Java后端开发者尤其是正在排查“body读了就丢”类玄学问题的中级工程师。2. 为什么直接读InputStream会翻车Servlet容器的流设计与不可重入本质2.1 HttpServletRequest的body流为何天生“一次性”HttpServletRequest.getInputStream()返回的是一个ServletInputStream它本质上是对底层Socket输入流的一层封装。关键点在于这个流没有缓冲区也没有重置能力。当你调用read()、readLine()或readAllBytes()时数据从TCP缓冲区被真实读出并移除后续再调用getInputStream()拿到的是同一个流对象但内部指针已到末尾available()返回0read()返回-1。这不是Bug而是Servlet规范的设计哲学——请求体作为“输入源”应由最终业务逻辑独占消费中间层不应干扰数据流向。提示getReader()同理它返回BufferedReader底层仍基于同一InputStream二者互斥使用。混用会导致IllegalStateException: getInputStream() has already been called。2.2 容器差异Tomcat、Jetty、Undertow对body流的实现边界虽然规范一致但各容器在具体实现上存在细微差别直接影响我们“绕过规范”的可行性容器是否支持request.getContentType()后仍可读body是否允许getContentLength()为-1时读bodyisAsyncStarted()对body读取的影响Tomcat 9✅ 支持但需确保未触发parseParameters()✅ 支持getInputStream()仍可用❌ 无影响异步模式下流行为一致Jetty 11✅ 支持但getReader()和getInputStream()不能交叉调用✅ 支持❌ 无影响Undertow✅ 支持但需注意HttpServerExchange的getAttachment()机制✅ 支持⚠️ 异步启动后需通过exchange.getAttachment()获取body缓存核心结论所有主流容器都遵循“流不可重入”原则但都允许你在未触发参数解析前安全读取一次原始body。而parseParameters()的触发时机正是我们能否“抢在Spring之前读body”的关键开关。2.3 Spring MVC如何悄悄“偷走”你的bodyDispatcherServlet的参数解析链Spring的DispatcherServlet在调用HandlerAdapter前会执行checkMultipart()和resolveHandlerMethod()其中resolveHandlerMethod()会触发HandlerMethodArgumentResolver链。而RequestBody对应的RequestResponseBodyMethodProcessor其resolveArgument()方法内部会调用readWithMessageConverters()该方法最终调用request.getInputStream()——此时若你已在Filter中读过流已空。更隐蔽的是只要请求头Content-Type包含application/x-www-form-urlencoded或multipart/form-dataSpring就会在DispatcherServlet.doDispatch()早期自动调用request.getParameterMap()从而触发parseParameters()。该方法不仅解析表单参数还会强制消费整个inputStream即使你没用RequestParam导致后续任何body读取失败。血泪经验某次线上事故前端发了个Content-Type: application/x-www-form-urlencoded; charsetUTF-8的JSON字符串错误配置后端Filter刚读完bodyController里RequestBody就报HttpMessageNotReadableException。根源就是parseParameters()把JSON当表单解析吃掉了流。3. 稳定提取body的三种落地方案从临时缓存到全局包装器3.1 方案一Filter内临时缓存最轻量适合单点日志适用场景仅需在某个特定Filter中记录原始body如审计日志不涉及跨Filter传递或多次读取。核心思路在Filter中读取InputStream全部字节转为byte[]缓存同时将HttpServletRequestWrapper包装后的请求向下传递使其getInputStream()返回缓存字节的ByteArrayInputStream。// BodyCachingFilter.java public class BodyCachingFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest (HttpServletRequest) request; // 1. 判断是否为POST且有body跳过GET/HEAD if (POST.equalsIgnoreCase(httpRequest.getMethod()) httpRequest.getContentLength() 0) { // 2. 读取原始body到byte[] byte[] bodyBytes StreamUtils.copyToByteArray(httpRequest.getInputStream()); // 3. 创建包装器覆盖getInputStream() HttpServletRequestWrapper wrappedRequest new HttpServletRequestWrapper(httpRequest) { Override public ServletInputStream getInputStream() throws IOException { ByteArrayInputStream bais new ByteArrayInputStream(bodyBytes); return new ServletInputStream() { Override public boolean isFinished() { return bais.available() 0; } Override public boolean isReady() { return true; } Override public void setReadListener(ReadListener readListener) {} Override public int read() throws IOException { return bais.read(); } }; } // 4. 覆盖getReader()避免与getInputStream()冲突 Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader( new ByteArrayInputStream(bodyBytes), StandardCharsets.UTF_8)); } }; // 5. 记录日志此处可加脱敏逻辑 String bodyStr new String(bodyBytes, StandardCharsets.UTF_8); log.info(Raw POST body: {}, bodyStr.substring(0, Math.min(500, bodyStr.length()))); chain.doFilter(wrappedRequest, response); return; } // 非POST或无body直通 chain.doFilter(request, response); } }参数说明StreamUtils.copyToByteArray()Spring Framework工具类安全读取流至内存自动处理-1结束。StandardCharsets.UTF_8显式指定编码避免ISO-8859-1默认编码导致中文乱码。bodyStr.substring(0, Math.min(500, ...))防止单条日志过大生产环境必须加长度限制。注意此方案将body全量加载进JVM堆内存严禁用于大文件上传10MB场景否则易触发Full GC。3.2 方案二全局RequestWrapper推荐适配Spring生态适用场景需在多个Filter、Interceptor、甚至Controller中多次读取body如Filter验签 Interceptor限流 Controller业务逻辑。核心思路创建一个继承ContentCachingRequestWrapper的包装器Spring官方提供它在构造时自动缓存body并重写getInputStream()/getReader()返回缓存副本。关键是要在Spring的DispatcherServlet执行前完成包装。// CachingRequestBodyFilter.java Component Order(Ordered.HIGHEST_PRECEDENCE) public class CachingRequestBodyFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest (HttpServletRequest) request; // 仅包装POST/PUT/PATCH等含body的请求 if (isBodyRequest(httpRequest)) { // Spring的ContentCachingRequestWrapper会缓存body到内存 ContentCachingRequestWrapper wrappedRequest new ContentCachingRequestWrapper(httpRequest); chain.doFilter(wrappedRequest, response); } else { chain.doFilter(request, response); } } private boolean isBodyRequest(HttpServletRequest req) { String method req.getMethod().toUpperCase(); return POST.equals(method) || PUT.equals(method) || PATCH.equals(method) || DELETE.equals(method); } }使用时获取body// 在任意Filter/Interceptor中 if (request instanceof ContentCachingRequestWrapper) { ContentCachingRequestWrapper wrapper (ContentCachingRequestWrapper) request; byte[] cachedBody wrapper.getContentAsByteArray(); // 原始字节 String bodyStr StreamUtils.copyToString( wrapper.getInputStream(), StandardCharsets.UTF_8); // 字符串 }优势Spring原生支持无需自己实现流重置逻辑。ContentCachingRequestWrapper内部使用ByteArrayOutputStream缓存线程安全。可通过spring.http.log-request-detailstrue开启自动日志但不推荐生产启用。提示ContentCachingRequestWrapper默认缓存上限为10MBDEFAULT_MAX_CACHE_SIZE1024*1024*10超限时getContentAsByteArray()返回空数组。如需调整在WebMvcConfigurer中注入ContentCachingRequestWrapperBean并设置setMaxCacheSize()。3.3 方案三异步非阻塞缓存高并发大body场景适用场景需处理GB级文件上传且要求低延迟、不阻塞线程如视频分片上传、大模型推理请求。核心思路放弃内存缓存改用File或ByteBuffer暂存body通过AsyncContext解耦读取与处理。// AsyncBodyCachingFilter.java public class AsyncBodyCachingFilter implements Filter { private final File tempDir new File(System.getProperty(java.io.tmpdir), body_cache); Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest (HttpServletRequest) request; if (!POST.equalsIgnoreCase(httpRequest.getMethod())) { chain.doFilter(request, response); return; } AsyncContext asyncContext httpRequest.startAsync(); asyncContext.setTimeout(30000); // 30秒超时 // 异步读取body到临时文件 CompletableFuture.supplyAsync(() - { try { File tempFile File.createTempFile(body_, .bin, tempDir); Files.copy(httpRequest.getInputStream(), tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); return tempFile; } catch (IOException e) { throw new RuntimeException(e); } }).thenAccept(tempFile - { // 将tempFile存入request属性供后续使用 httpRequest.setAttribute(cachedBodyFile, tempFile); try { chain.doFilter(request, response); } catch (Exception e) { throw new RuntimeException(e); } }).exceptionally(ex - { log.error(Async body cache failed, ex); return null; }); } }关键约束必须配合EnableAsync和TaskExecutor使用否则supplyAsync在主线程执行失去异步意义。临时文件需定期清理如用ScheduledExecutorService扫描lastModified 1h的文件。Controller中需手动Files.readAllBytes(tempFile.toPath())无法像内存缓存那样直接调用getInputStream()。翻车预警若未调用asyncContext.complete()请求会永远挂起。务必在chain.doFilter()后或异常时调用asyncContext.complete()。4. 避坑指南生产环境踩过的5个真实坑与解决方案4.1 现象Filter中读取body后RequestBody报HttpMessageNotReadableException提示JSON parse error: Cannot construct instance of ...原因请求头Content-Type为application/json;charsetUTF-8但Filter中调用了request.getParameterMap()或request.getParameter(xxx)。这会触发Servlet容器的parseParameters()强制消费inputStream即使JSON不包含表单参数。解决绝对禁止在Filter中调用getParameter*()系列方法。如需获取查询参数用request.getQueryString()手动解析推荐UriComponentsBuilder。或改用ContentCachingRequestWrapper它重写了getParameterMap()返回空Map而不触发解析。4.2 现象ContentCachingRequestWrapper获取的body为空length0原因ContentCachingRequestWrapper的缓存大小超出默认上限10MB或请求Content-Length为0如Chunked Transfer-Encoding。解决检查request.getContentLength()是否为-1表示分块传输此时ContentCachingRequestWrapper无法缓存需改用方案三。在WebMvcConfigurer中扩大缓存Bean public FilterRegistrationBeanContentCachingRequestWrapper cachingFilter() { FilterRegistrationBeanContentCachingRequestWrapper registration new FilterRegistrationBean(); registration.setFilter(new ContentCachingRequestWrapper()); registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 扩大缓存至100MB registration.addInitParameter(maxCacheSize, 104857600); return registration; }4.3 现象多线程环境下ContentCachingRequestWrapper.getContentAsByteArray()返回null原因ContentCachingRequestWrapper的content字段是volatile byte[]但getContentAsByteArray()方法未加锁多线程并发调用时可能返回未完全写入的数组。解决不要直接调用getContentAsByteArray()改用StreamUtils.copyToByteArray(getInputStream())。或自行加同步块synchronized (wrapper) { byte[] content wrapper.getContentAsByteArray(); if (content null || content.length 0) { // 触发缓存填充 wrapper.getInputStream().readAllBytes(); } }4.4 现象Filter中使用request.getReader()后Controller里RequestBody报IllegalStateException: getInputStream() has already been called原因getReader()和getInputStream()互斥Servlet规范禁止在同一请求中混合调用。解决统一使用getInputStream()避免getReader()。若必须用字符流用new BufferedReader(new InputStreamReader(inputStream, charset))而非request.getReader()。4.5 现象ContentCachingRequestWrapper在Spring Cloud Gateway中失效原因Gateway基于WebFluxReactor不使用Servlet APIHttpServletRequestWrapper类不存在。解决WebFlux场景改用ServerWebExchange的getFormData()或getBody()。对于原始body需用exchange.getRequest().getBody()返回FluxDataBuffer并用DataBufferUtils.join()合并DataBufferUtils.join(exchange.getRequest().getBody()) .map(dataBuffer - { byte[] bytes new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); DataBufferUtils.release(dataBuffer); return bytes; }) .block(); // 注意block()仅用于调试生产用flatMap5. 进阶技巧精准控制缓存时机与动态脱敏策略5.1 按请求路径/Header动态启用缓存避免全量开销全量缓存body会带来内存压力应按需启用。例如仅对/api/v1/transfer路径或带X-Need-Log: trueHeader的请求缓存。// PathAndHeaderBasedCachingFilter.java public class PathAndHeaderBasedCachingFilter implements Filter { private static final SetString CACHE_PATHS Set.of(/api/v1/transfer, /api/v1/sign); private static final String NEED_LOG_HEADER X-Need-Log; Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest (HttpServletRequest) request; boolean shouldCache CACHE_PATHS.contains(httpRequest.getRequestURI()) || true.equalsIgnoreCase(httpRequest.getHeader(NEED_LOG_HEADER)); if (shouldCache POST.equalsIgnoreCase(httpRequest.getMethod())) { ContentCachingRequestWrapper wrapper new ContentCachingRequestWrapper(httpRequest); chain.doFilter(wrapper, response); } else { chain.doFilter(request, response); } } }价值将缓存开销从100%降至5%内存占用下降80%GC频率显著降低。5.2 敏感字段动态脱敏在日志前抹掉密码、token原始body日志可能泄露敏感信息。应在缓存后、记录前执行脱敏而非简单截断。// SensitiveFieldSanitizer.java public class SensitiveFieldSanitizer { // 正则匹配常见敏感字段 private static final Pattern PASSWORD_PATTERN Pattern.compile((\password\\\s*:\\s*\[^\]\), Pattern.CASE_INSENSITIVE); private static final Pattern TOKEN_PATTERN Pattern.compile((\token\\\s*:\\s*\[^\]\), Pattern.CASE_INSENSITIVE); private static final Pattern ID_CARD_PATTERN Pattern.compile((\idCard\\\s*:\\s*\[0-9Xx]{17}[0-9Xx]\), Pattern.CASE_INSENSITIVE); public static String sanitize(String body) { String sanitized PASSWORD_PATTERN.matcher(body).replaceAll(\password\:\***\); sanitized TOKEN_PATTERN.matcher(sanitized).replaceAll(\token\:\***\); sanitized ID_CARD_PATTERN.matcher(sanitized).replaceAll(\idCard\:\***\); return sanitized; } } // 在Filter中调用 String bodyStr StreamUtils.copyToString(wrapper.getInputStream(), StandardCharsets.UTF_8); log.info(Sanitized body: {}, SensitiveFieldSanitizer.sanitize(bodyStr));注意正则需根据实际JSON结构调整避免误杀如password_hint:your password。生产环境建议用Jackson解析后遍历节点脱敏更精准但性能略低。5.3 缓存命中率监控量化优化效果为验证方案有效性添加埋点统计缓存使用情况Component public class BodyCacheMetrics { private final MeterRegistry meterRegistry; private final Counter cacheHitCounter; private final Counter cacheMissCounter; public BodyCacheMetrics(MeterRegistry meterRegistry) { this.meterRegistry meterRegistry; this.cacheHitCounter Counter.builder(body.cache.hit) .description(Count of requests with cached body).register(meterRegistry); this.cacheMissCounter Counter.builder(body.cache.miss) .description(Count of requests without cached body).register(meterRegistry); } public void recordHit() { cacheHitCounter.increment(); } public void recordMiss() { cacheMissCounter.increment(); } }在Filter中if (shouldCache) { wrapper new ContentCachingRequestWrapper(httpRequest); metrics.recordHit(); } else { metrics.recordMiss(); }通过Prometheus查看body_cache_hit_total指标确认缓存策略是否覆盖了目标流量。我一般会在上线前压测时用jstat -gc pid观察Eden区GC频率对比开启缓存前后的YGC次数再结合body_cache_hit_total确认缓存命中率是否达预期95%。如果命中率低说明动态启用规则太严需放宽路径或Header条件。这套组合拳下来既能保住body可读性又不会让JVM内存告急——这才是工程落地的平衡点。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

低代码之王是谁?五大技术流派深度对比与选型指南

低代码之王是谁?五大技术流派深度对比与选型指南

过去一年,我至少被问过三十次"低代码到底选哪个平台"。问的人里有IT主管、有业务部门的数字化专员,也有刚被老板布置了"快速搭一个OA"任务的前端开发。而每次聊到最后,问题都会变成同一个:谁才是低代码之王&a…

2026/10/18 0:55:34 阅读更多 →
大模型基础设施五维诊断与压测实战手册

大模型基础设施五维诊断与压测实战手册

简介:本资源是《2025高质量大模型基础设施研究报告》官方PDF版,由中国信息通信研究院人工智能研究所于2025年1月权威发布,面向AI架构师、大模型平台工程师、云计算基础设施研发人员及企业技术决策者,系统回应大模型规模化落地中基…

2026/10/18 0:54:33 阅读更多 →
三个月实测:Qoder如何成为最懂你项目的AI编程IDE

三个月实测:Qoder如何成为最懂你项目的AI编程IDE

我是在一次模块交接会上意识到这件事的。当时我正准备给新来的同事讲一块三年前的订单状态机,随口说了句“这个状态流转好像不支持部分退款”。Qoder 在旁边的编辑器里弹出了一条注释级别的提示,把我们项目里RefundStatus和OrderStatus的关联规则列了出来…

2026/10/18 0:54:33 阅读更多 →

最新新闻

大麦网自动抢票脚本快速上手:Automatic_ticket_purchase 新手完整指南

大麦网自动抢票脚本快速上手:Automatic_ticket_purchase 新手完整指南

大麦网自动抢票脚本快速上手:Automatic_ticket_purchase 新手完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase Automatic_ticket_purchase 是一个开源的大…

2026/10/18 1:33:47 阅读更多 →
Python课件高效学习指南:73页PPT拆解与实战路径

Python课件高效学习指南:73页PPT拆解与实战路径

简介:这份Python学习课件以73张PPT的形式系统梳理了Python入门阶段的核心知识,面向零基础初学者、高校学生以及需要快速回顾语法要点的开发者,帮助读者在较短时间内建立对Python语言的整体认知。压缩包内共1个PPT文件,大小约13.02…

2026/10/18 1:33:47 阅读更多 →
163MusicLyrics:免费的跨平台歌词提取工具,一键获取网易云与QQ音乐歌词

163MusicLyrics:免费的跨平台歌词提取工具,一键获取网易云与QQ音乐歌词

163MusicLyrics:免费的跨平台歌词提取工具,一键获取网易云与QQ音乐歌词 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 163MusicLyrics 是一款免费…

2026/10/18 1:33:47 阅读更多 →
Maven 3.6.3 稳定版安装配置与避坑指南

Maven 3.6.3 稳定版安装配置与避坑指南

简介:Apache Maven 3.6.3是Java生态中主流的项目构建与依赖管理工具,基于POM模型实现标准化生命周期。面向需要离线搭建Maven环境、或希望快速获得可复用依赖库的Java开发者,适用于内网开发、持续集成及教学实验等场景。压缩包共2000个文件&a…

2026/10/18 1:33:47 阅读更多 →
用C++从零实现一个OllyDbg风格调试器:事件循环、断点与反汇编

用C++从零实现一个OllyDbg风格调试器:事件循环、断点与反汇编

简介:这是一款基于Windows 10平台、以C/C语言实现的调试器源码工程,整体仿照OllyDebug设计,适合软件开发人员、逆向工程师及安全研究人员学习调试器底层机制与实战技巧。工程覆盖创建与附加进程、汇编代码查看与修改、内存/栈/寄存器操作、模…

2026/10/18 1:33:47 阅读更多 →
tiny11builder:1 条命令瘦身 Win11 镜像

tiny11builder:1 条命令瘦身 Win11 镜像

tiny11builder:1 条命令瘦身 Win11 镜像 【免费下载链接】tiny11builder WinUI app for building smaller, customized Windows 11 images. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 如果你的机器上有官方 Windows 11 ISO&#xff0…

2026/10/18 1:32:47 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →