BIO与NIO、AIO的区别(这个容易理解)
前言在Java网络编程和高性能服务器开发中I/O模型的选择直接影响着系统的并发处理能力、资源利用效率和整体性能表现。随着互联网应用规模的不断扩大传统的同步阻塞I/OBIO已难以满足高并发场景的需求而同步非阻塞I/ONIO和异步非阻塞I/OAIO则提供了更高效的解决方案。本文旨在系统性地介绍Java中三种主要的I/O模型BIO、NIO和AIO深入剖析它们的工作原理、核心组件、适用场景以及在实际开发中的实现方式。通过对比分析这三种模型的优缺点帮助开发者根据具体业务需求选择最合适的I/O模型构建高性能、高可用的网络应用系统。IO的方式通常分为几种同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO同步阻塞IO在JDK1.4出来之前我们建立网络连接的时候采用BIO模式需要先在服务端启动一个ServerSocket然后在客户端启动Socket来对服务端进行通信。默认情况下服务端需要对每个请求建立一堆线程等待请求而客户端发送请求后先咨询服务端是否有线程响应如果没有则会一直等待或者遭到拒绝请求如果有的话客户端线程会等待请求结束后才继续执行。二、NIO同步非阻塞IO2.1 NIO的核心思想NIO本身是基于事件驱动思想来完成的其主要想解决的是BIO的大并发问题。在使用同步I/O的网络应用中如果要同时处理多个客户端请求或是在客户端要同时和多个服务器进行通讯就必须使用多线程来处理。也就是说将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求但同时又会带来另外一个问题。由于每创建一个线程就要为这个线程分配一定的内存空间也叫工作存储器而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多服务端程序可能会因为不堪重负而拒绝客户端的请求甚至服务器可能会因此而瘫痪。2.2 Reactor模式与NIONIO基于Reactor模式当socket有流可读或可写入socket时操作系统会相应的通知应用程序进行处理应用再将流读取到缓冲区或写入操作系统。也就是说这个时候已经不是一个连接就要对应一个处理线程了而是有效的请求对应一个线程当连接没有数据时是没有工作线程来处理的。2.3 BIO与NIO的线程模型对比BIO与NIO一个比较重要的不同是我们使用BIO的时候往往会引入多线程每个连接一个单独的线程而NIO则是使用单线程或者只使用少量的多线程每个连接共用一个线程。2.4 NIO的多路复用机制NIO的最重要的地方是当一个连接创建后不需要对应一个线程这个连接会被注册到多路复用器上面所以所有的连接只需要一个线程就可以搞定。当这个线程中的多路复用器进行轮询的时候发现连接上有请求的话才开启一个线程进行处理也就是一个请求一个线程模式。2.5 NIO的潜在问题在NIO的处理方式中当一个请求来的话开启线程进行处理可能会等待后端应用的资源JDBC连接等其实这个线程就被阻塞了当并发上来的话还是会有BIO一样的问题。2.6 HTTP长连接与NIO的优化HTTP/1.1出现后有了Http长连接这样除了超时和指明特定关闭的http header外这个链接是一直打开的状态的。这样在NIO处理中可以进一步的进化在后端资源中可以实现资源池或者队列当请求来的话开启的线程把请求和请求数据传送给后端资源池或者队列里面就返回并且在全局的地方保持住这个现场哪个连接的哪个请求等。这样前面的线程还是可以去接受其他的请求而后端的应用的处理只需要执行队列里面的就可以了这样请求处理和后端应用是异步的。当后端处理完到全局地方得到现场产生响应这个就实现了异步处理。三、AIO异步非阻塞IO3.1 AIO的基本原理与NIO不同当进行读写操作时只须直接调用API的read或write方法即可。这两种方法均为异步的对于读操作而言当有流可读取时操作系统会将可读的流传入read方法的缓冲区并通知应用程序对于写操作而言当操作系统将write方法传递的流写入完毕时操作系统主动通知应用程序即可以理解为read/write方法都是异步的完成后会主动调用回调函数。3.2 JDK中的AIO支持在JDK1.7中这部分内容被称作NIO.2主要在java.nio.channels包下增加了下面四个异步通道AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannelAsynchronousDatagramChannel其中的read/write方法会返回一个带回调函数的对象当执行完读取/写入操作后直接调用回调函数。四、三种IO模型的对比总结4.1 核心区别BIO一个连接一个线程NIO一个请求一个线程AIO一个有效请求一个线程4.2 银行取款类比理解先来个例子理解一下概念以银行取款为例同步自己亲自出马持银行卡到银行取钱使用同步IO时Java自己处理IO读写异步委托一小弟拿银行卡到银行取钱然后给你使用异步IO时Java将IO读写委托给OS处理需要将数据缓冲区地址和大小传给OS银行卡和密码OS需要支持异步IO操作API阻塞ATM排队取款你只能等待使用阻塞IO时Java调用会一直阻塞到读写完成才返回非阻塞柜台取款取个号然后坐在椅子上做其它事等号广播会通知你办理没到号你就不能去你可以不断问大堂经理排到了没有大堂经理如果说还没到你就不能去使用非阻塞IO时如果不能读写Java调用会马上返回当IO事件分发器会通知可读写时再继续进行读写不断循环直到读写完成4.3 Java对三种IO模型的支持Java BIO同步并阻塞服务器实现模式为一个连接一个线程即客户端有连接请求时服务器端就需要启动一个线程进行处理如果这个连接不做任何事情会造成不必要的线程开销当然可以通过线程池机制改善。Java NIO同步非阻塞服务器实现模式为一个请求一个线程即客户端发送的连接请求都会注册到多路复用器上多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。Java AIONIO.2异步非阻塞服务器实现模式为一个有效请求一个线程客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。4.4 代码示例三种IO模型的Java实现下面分别展示BIO、NIO和AIO创建服务器端的最小示例代码BIO示例同步阻塞IOimport java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class BioServer { public static void main(String[] args) throws IOException { // 创建ServerSocket监听8080端口 ServerSocket serverSocket new ServerSocket(8080); System.out.println(BIO服务器启动监听端口: 8080); while (true) { // accept()会阻塞直到有客户端连接 Socket socket serverSocket.accept(); System.out.println(接收到客户端连接: socket.getInetAddress()); // 为每个连接创建新线程处理 new Thread(() - { try { InputStream input socket.getInputStream(); byte[] buffer new byte[1024]; int len; // read()会阻塞直到有数据可读 while ((len input.read(buffer)) ! -1) { System.out.println(收到数据: new String(buffer, 0, len)); } socket.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); } } }NIO示例同步非阻塞IOimport java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class NioServer { public static void main(String[] args) throws IOException { // 创建Selector多路复用器 Selector selector Selector.open(); // 创建ServerSocketChannel并设置为非阻塞模式 ServerSocketChannel serverChannel ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.bind(new InetSocketAddress(8080)); // 将ServerSocketChannel注册到Selector监听ACCEPT事件 serverChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println(NIO服务器启动监听端口: 8080); while (true) { // select()会阻塞直到有事件就绪 selector.select(); SetSelectionKey selectedKeys selector.selectedKeys(); IteratorSelectionKey iter selectedKeys.iterator(); while (iter.hasNext()) { SelectionKey key iter.next(); iter.remove(); if (key.isAcceptable()) { // 处理新连接 ServerSocketChannel server (ServerSocketChannel) key.channel(); SocketChannel client server.accept(); client.configureBlocking(false); // 将新连接注册到Selector监听READ事件 client.register(selector, SelectionKey.OP_READ); System.out.println(接收到新连接: client.getRemoteAddress()); } else if (key.isReadable()) { // 处理读事件 SocketChannel client (SocketChannel) key.channel(); ByteBuffer buffer ByteBuffer.allocate(1024); int len client.read(buffer); if (len 0) { buffer.flip(); byte[] data new byte[buffer.remaining()]; buffer.get(data); System.out.println(收到数据: new String(data)); } else if (len -1) { client.close(); } } } } } }AIO示例异步非阻塞IOimport java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; public class AioServer { public static void main(String[] args) throws IOException, InterruptedException { // 创建AsynchronousServerSocketChannel AsynchronousServerSocketChannel serverChannel AsynchronousServerSocketChannel.open(); serverChannel.bind(new InetSocketAddress(8080)); System.out.println(AIO服务器启动监听端口: 8080); // 异步接受连接使用CompletionHandler处理连接完成事件 serverChannel.accept(null, new CompletionHandlerAsynchronousSocketChannel, Void() { Override public void completed(AsynchronousSocketChannel client, Void attachment) { // 继续接受下一个连接 serverChannel.accept(null, this); // 处理当前连接 ByteBuffer buffer ByteBuffer.allocate(1024); // 异步读取数据 client.read(buffer, buffer, new CompletionHandlerInteger, ByteBuffer() { Override public void completed(Integer result, ByteBuffer buffer) { if (result 0) { buffer.flip(); byte[] data new byte[buffer.remaining()]; buffer.get(data); System.out.println(收到数据: new String(data)); } try { client.close(); } catch (IOException e) { e.printStackTrace(); } } Override public void failed(Throwable exc, ByteBuffer buffer) { exc.printStackTrace(); try { client.close(); } catch (IOException e) { e.printStackTrace(); } } }); } Override public void failed(Throwable exc, Void attachment) { exc.printStackTrace(); } }); // 保持主线程运行 Thread.currentThread().join(); } }代码说明BIO示例使用ServerSocket和Socket每个连接创建一个新线程accept()和read()都是阻塞调用。NIO示例使用Selector多路复用器单线程处理多个连接通过事件驱动方式处理连接和读写。AIO示例使用AsynchronousServerSocketChannel通过CompletionHandler回调处理连接和读写完全异步非阻塞。4.4 适用场景分析BIO方式适用于连接数目比较小且固定的架构这种方式对服务器资源要求比较高并发局限于应用中JDK1.4以前的唯一选择但程序直观简单易理解。NIO方式适用于连接数目多且连接比较短轻操作的架构比如聊天服务器并发局限于应用中编程比较复杂JDK1.4开始支持。AIO方式适用于连接数目多且连接比较长重操作的架构比如相册服务器充分调用OS参与并发操作编程比较复杂JDK7开始支持。五、深入理解IO模型5.1 操作系统层面的考虑另外I/O属于底层操作需要操作系统支持并发也需要操作系统的支持所以性能方面不同操作系统差异会比较明显。5.2 Reactor与Proactor模式在高性能的I/O设计中有两个比较著名的模式Reactor和Proactor模式其中Reactor模式用于同步I/O而Proactor运用于异步I/O操作。下面通过流程图展示这两种模式的核心组件与数据流向Reactor模式同步I/O流程图flowchart TD subgraph Reactor模式 A[客户端请求] -- B[Initiation Dispatcher 事件分发器] B -- C[Handle 资源句柄] C -- D[Synchronous Event Demultiplexer 同步事件多路分离器] D --|等待事件就绪| E[Event Handler 事件处理器] E --|处理就绪事件| F[Concrete Event Handler 具体事件处理器] F --|执行实际I/O操作| G[返回结果] style A fill:#e1f5fe style B fill:#f3e5f5 style C fill:#e8f5e8 style D fill:#fff3e0 style E fill:#fce4ec style F fill:#e8eaf6 style G fill:#f1f8e9 end图注说明Reactor模式采用同步I/O核心组件包括事件分发器、同步事件多路分离器和事件处理器。工作流程1) 客户端请求注册到事件分发器2) 同步事件多路分离器等待I/O事件就绪3) 事件就绪后分发器调用对应的事件处理器4) 具体事件处理器执行实际的I/O操作。Proactor模式异步I/O流程图flowchart TD subgraph Proactor模式 A[客户端请求] -- B[Asynchronous Operation Processor 异步操作处理器] B -- C[发起异步I/O操作] C -- D[操作系统内核] D --|I/O操作完成| E[Completion Dispatcher 完成分发器] E -- F[Completion Handler 完成处理器] F -- G[Proactor 主动器] G -- H[返回结果] style A fill:#e1f5fe style B fill:#f3e5f5 style C fill:#e8f5e8 style D fill:#fff3e0 style E fill:#fce4ec style F fill:#e8eaf6 style G fill:#f1f8e9 style H fill:#fff8e1 end图注说明Proactor模式采用异步I/O核心组件包括异步操作处理器、完成分发器和完成处理器。工作流程1) 客户端请求到达异步操作处理器2) 处理器发起异步I/O操作给操作系统内核3) 内核完成I/O操作后通知完成分发器4) 分发器调用对应的完成处理器5) 完成处理器将结果交给Proactor主动器处理。两种模式对比Reactor模式同步I/O应用程序主动等待事件就绪然后执行I/O操作。适用于连接数多但每个连接数据量不大的场景。Proactor模式异步I/O应用程序发起I/O操作后立即返回由操作系统完成I/O操作后通知应用程序。适用于连接数多且每个连接数据量大的场景。关键区别Reactor模式中应用程序执行实际的I/O操作而Proactor模式中操作系统执行实际的I/O操作。5.3 阻塞/非阻塞与同步/异步的概念澄清在比较这两个模式之前我们首先的搞明白几个概念同步和异步是针对应用程序和内核的交互而言的同步用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪异步用户进程触发IO操作以后便开始做自己的事情而当IO操作已经完成的时候会得到IO完成的通知阻塞和非阻塞是针对于进程在访问数据的时候根据IO操作的就绪状态来采取的不同方式说白了是一种读取或者写入操作函数的实现方式阻塞方式下读取或者写入函数将一直等待非阻塞方式下读取或者写入函数会立即返回一个状态值5.4 四种IO模型分类一般来说I/O模型可以分为同步阻塞同步非阻塞异步阻塞异步非阻塞IO5.4.1 同步阻塞IO在此种方式下用户进程在发起一个IO操作以后必须等待IO操作的完成只有当真正完成了IO操作以后用户进程才能运行。JAVA传统的IO模型属于此种方式5.4.2 同步非阻塞IO在此种方式下用户进程发起一个IO操作以后边可返回做其它事情但是用户进程需要时不时的询问IO操作是否就绪这就要求用户进程不停的去询问从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。5.4.3 异步阻塞IO此种方式下是指应用发起一个IO操作以后不等待内核IO操作的完成等内核完成IO操作以后会通知应用程序这其实就是同步和异步最关键的区别同步必须等待或者主动的去询问IO是否完成。那么为什么说是阻塞的呢因为此时是通过select系统调用来完成的而select函数本身的实现方式是阻塞的而采用select函数有个好处就是它可以同时监听多个文件句柄从而提高系统的并发性5.4.4 异步非阻塞IO在此种模式下用户进程只需要发起一个IO操作然后立即返回等IO操作真正的完成以后应用程序会得到IO操作完成的通知此时用户进程只需要对数据进行处理就好了不需要进行实际的IO读写操作因为真正的IO读取或者写入操作已经由内核完成了。总结通过对BIO、NIO和AIO三种I/O模型的深入分析我们可以得出以下结论技术演进趋势BIO同步阻塞I/O作为Java最早的I/O模型实现简单直观适合连接数较少且固定的场景但线程资源消耗大不适合高并发环境。NIO同步非阻塞I/O基于事件驱动和多路复用机制显著提升了系统的并发处理能力适合连接数多但每个连接数据量不大的场景如聊天服务器、即时通讯等。AIO异步非阻塞I/O真正意义上的异步I/O由操作系统完成I/O操作后回调通知应用程序适合连接数多且每个连接数据量大的场景如文件服务器、相册服务等。选择建议简单应用场景如果应用连接数较少如内部管理系统、小型网站BIO因其简单性仍是合适选择。高并发短连接对于需要处理大量短连接的应用如即时通讯、API网关NIO的多路复用特性能够显著提升性能。高并发长连接大数据量对于需要处理大量长连接且数据传输量大的应用如文件传输、视频流服务AIO能够充分利用操作系统能力提供最佳性能。技术栈考虑NIO在JDK1.4引入AIO在JDK1.7引入需要考虑目标环境的JDK版本支持情况。实践建议理解底层原理比单纯使用框架更重要掌握Reactor和Proactor模式有助于设计更合理的系统架构。在实际项目中Netty、Mina等NIO框架已经对底层NIO进行了良好封装提供了更易用的API和更完善的生态。性能测试是选择I/O模型的关键环节应在真实业务场景下进行压力测试根据实际表现做出决策。监控和调优同样重要需要关注线程池配置、缓冲区大小、连接超时等参数的优化。总之没有一种I/O模型能够适用于所有场景。开发者需要根据具体的业务需求、性能要求、团队技术栈和运维能力选择最合适的I/O模型。随着技术的不断发展新的I/O模型和优化策略也在不断涌现保持学习和实践是提升系统性能的关键。

相关新闻

TigerVNC终极快捷键指南:解决远程桌面热键冲突的完整方案

TigerVNC终极快捷键指南:解决远程桌面热键冲突的完整方案

TigerVNC终极快捷键指南:解决远程桌面热键冲突的完整方案 【免费下载链接】tigervnc High performance, multi-platform VNC client and server 项目地址: https://gitcode.com/gh_mirrors/ti/tigervnc 还在为远程桌面时无法使用AltTab切换窗口而烦恼&#x…

2026/9/29 6:15:08 阅读更多 →
Netty 入门实战:从零搭建 Discard、Echo 和 Time 服务器

Netty 入门实战:从零搭建 Discard、Echo 和 Time 服务器

一、引言:为什么需要 Netty? 现在我们使用通用应用程序或包进行通信。例如,我们经常使用 HTTP 客户端库从 Web 服务器检索信息,并通过 Web 服务调用远程过程调用。然而,通用协议或其实现有时不能很好地扩展。这就像我…

2026/9/28 16:44:58 阅读更多 →
快速解密QQ聊天记录:全平台数据库密钥提取终极指南 [特殊字符]

快速解密QQ聊天记录:全平台数据库密钥提取终极指南 [特殊字符]

快速解密QQ聊天记录:全平台数据库密钥提取终极指南 🚀 【免费下载链接】qq-win-db-key 全平台 QQ 聊天数据库解密 项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key 你是否曾想备份珍贵的QQ聊天记录,却发现数据库被加密无法…

2026/9/27 18:56:25 阅读更多 →

最新新闻

OpenClaw技能机制与PyCharm集成:自动化整理知识库的实操指南

OpenClaw技能机制与PyCharm集成:自动化整理知识库的实操指南

先说明我的身份:一个整天泡在代码和文档堆里的普通开发者。最近一个月,我把个人知识库的整理流程整个搬到了 OpenClaw 上,中文社区给它的昵称是“小龙虾”。这个称呼初听有点搞笑,但用顺手之后你会觉得,它确实像一只壳…

2026/10/13 13:10:21 阅读更多 →
Docker多容器上传图片:Permission Denied与404排查实战

Docker多容器上传图片:Permission Denied与404排查实战

先把结论放前面:这个标题里藏着的两个报错,其实是 Docker 多容器架构下静态资源服务链路中最典型的两个节点故障。Permission Denied 出在“写入侧”,404 出在“读取侧”,但根子往往都埋在同一套卷挂载、用户映射和 Nginx 配置里。…

2026/10/13 13:10:21 阅读更多 →
华为eNSP国赛综合实验:VLAN、OSPF、BGP、NAT与防火墙全解析

华为eNSP国赛综合实验:VLAN、OSPF、BGP、NAT与防火墙全解析

简介:这份资源面向备战华为ICT大赛网络赛道的高校学生与指导教师,聚焦2022-2023年度国赛实验ESNP真题及完整详细答案,帮助读者在赛前系统演练网络设计、设备配置与故障排查等核心技能。压缩包共34个文件,约82KB,以efz设…

2026/10/13 13:10:21 阅读更多 →
SpringBoot+Vue+MySQL商铺管理系统设计与实现:从选题到部署全解析

SpringBoot+Vue+MySQL商铺管理系统设计与实现:从选题到部署全解析

每年到了一年一度的毕业设计时段,最让人头大的就是选题和落地。选个纯管理系统怕太简单,选个新技术栈又怕做不完。今天这篇,我直接拿一套已经完整落地的 SpringBoot Vue MySQL 商铺管理系统平台来拆解,从为什么选这个题、数据库…

2026/10/13 13:10:21 阅读更多 →
AI辅助写作与人机协作实践指南

AI辅助写作与人机协作实践指南

我无法生成《2026必备10个降AI率工具测评榜单》这篇博文 原因很直接:这个选题的核心是围绕“如何降低AI生成内容被检测到的概率”来推荐和评测工具。无论是针对作业、论文还是对外发布的内容,这类榜单的实际价值都是在教读者绕过AI检测机制,掩…

2026/10/13 13:10:21 阅读更多 →
Eclipse Mars绿色版使用指南:老IDE的现状与配置实战

Eclipse Mars绿色版使用指南:老IDE的现状与配置实战

简介:Eclipse-jee-mars-R-win32-x86_64位官方绿色版.zip 是一份面向 Windows 64 位系统的 Eclipse JEE 官方正式版压缩包,定位 Java 企业级与 Web 开发,适合需要快速搭建集成开发环境的 Java 工程师、教学演示及团队协作场景。它基于 2015 年…

2026/10/13 13:09:21 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →