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/8/13 1:19:51 阅读更多 →
Netty 入门实战:从零搭建 Discard、Echo 和 Time 服务器

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

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

2026/8/13 1:19:51 阅读更多 →
快速解密QQ聊天记录:全平台数据库密钥提取终极指南 [特殊字符]

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

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

2026/8/13 1:19:51 阅读更多 →

最新新闻

CTF解题自动化:从手搓到高效工具链的进阶指南

CTF解题自动化:从手搓到高效工具链的进阶指南

大家好,我是专注于网络安全技术分享的博主。在CTF(Capture The Flag)夺旗赛中,你是否还在为一道Web题反复手动测试、为隐写术的图片一张张用不同工具尝试、为密码学题目手动写脚本而耗费大量时间?这种“手搓”解题方式…

2026/8/13 2:21:13 阅读更多 →
Adobe GenP 3.0:终极Adobe Creative Cloud通用补丁完整指南

Adobe GenP 3.0:终极Adobe Creative Cloud通用补丁完整指南

Adobe GenP 3.0:终极Adobe Creative Cloud通用补丁完整指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe GenP 3.0是一款功能强大的Adobe Creat…

2026/8/13 2:21:13 阅读更多 →
Python二叉树重建与树形DP:从遍历序列到父子节点条件判断

Python二叉树重建与树形DP:从遍历序列到父子节点条件判断

1. 题目背景与核心挑战解析“父与子”这个标题,乍一看充满了温情,但在2022年全国青少年信息素养大赛Python国赛的赛场上,它却是一道让许多选手感到棘手甚至“抓狂”的题目。这道题被标记为第10题,通常意味着它是压轴或接近压轴的高…

2026/8/13 2:21:13 阅读更多 →
智能汽车底盘域:从协同控制到线控执行的技术演进与实践

智能汽车底盘域:从协同控制到线控执行的技术演进与实践

1. 从“四个轮子”到“智能底盘”:为什么底盘域成了新焦点十年前,我们聊一辆车,发动机、变速箱、底盘是三大件。底盘嘛,就是悬架、转向、制动这些,负责支撑、减震、转向,保证车子能开、能停、能拐弯。但今天…

2026/8/13 2:21:13 阅读更多 →
CSS阴影深度解析:从box-shadow到text-shadow的进阶应用与性能优化

CSS阴影深度解析:从box-shadow到text-shadow的进阶应用与性能优化

1. 从“影子”说起:为什么CSS阴影不只是装饰在网页设计的早期,我们谈论“立体感”和“层次”,往往需要切图、用背景图片、甚至借助Flash来实现。那个时代,一个带阴影的按钮可能意味着多一次HTTP请求和额外的维护成本。后来&#x…

2026/8/13 2:21:13 阅读更多 →
Unity云渲染实战:基于Render Streaming 3.0.1的本地Web部署指南

Unity云渲染实战:基于Render Streaming 3.0.1的本地Web部署指南

1. 项目概述与核心价值 最近在折腾一个需求,需要把Unity做的3D应用,让没有安装Unity、甚至电脑配置一般的用户,也能通过浏览器流畅地体验。这听起来是不是有点像“云游戏”?没错,背后的核心技术就是云渲染。Unity官方提…

2026/8/13 2:20:12 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →