仓颉编程语言 I/O 节点流完全指南:标准流与文件流的实战解析
文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载本篇技术指南围绕仓颉编程语言Cangjie的I/O 节点流展开系统讲解标准流Console封装的标准输入/输出/错误流与文件流std.fs包的File类型的概念、API 用法与底层实现原理。读者学完后将掌握如何在命令行程序中读取键盘输入、向屏幕输出内容以及如何通过常规文件操作、流式读写和 try-with-resource 语法高效地处理文件数据。文中所有结论均有本仓库内的官方文档与 API 源码佐证可直接对照验证。什么是节点流仓颉编程语言将程序与外部载体交互的操作抽象为I/OInput 对应输入Output 对应输出所有 I/O 机制都基于数据流Stream进行流本质上是字节数据的有序序列就像承载数据的管道参见 I/O 流概述。按照职责差异流可分成两类节点流Node Stream直接提供数据源其构造方式通常依赖某种直接的外部资源如文件、网络等处理流Process Stream只能代理其他数据流进行处理构造方式通常依赖其他流如缓冲流、字符串流详见姊妹篇 I/O 处理流。仓颉编程语言中常见的节点流包括节点流数据源标准流StdIn、StdOut、StdErr键盘、终端屏幕文件流File文件系统中的文件网络流Socket网络连接本章重点介绍标准流和文件流两类最常用的节点流。标准流程序与外部交互的标准接口标准流包含三个部分标准输入流stdin程序从外部读取数据的通道默认来源于键盘输入例如命令行界面中输入的文本标准输出流stdout程序输出运行结果的通道默认输出到屏幕标准错误流stderr程序输出错误信息的通道默认也输出到屏幕。在 Unix/Linux 系统中标准输入、标准输出和标准错误分别对应文件描述符 0、1 和 2参见 std.console 包概览。在仓颉编程语言中可以通过Console类型分别访问它们。导入 console 包使用Console类型需要先导入console包import std.console.*Console对三个标准流都进行了易用性封装提供了更方便的基于String的扩展操作并且针对很多常见类型整数、浮点数、布尔值、Rune、String等都提供了丰富的write重载来优化性能。其中最重要的是Console提供了并发安全的保证可以在任意线程中安全地通过Console提供的接口来读写内容。说明在 API 文档中std.console包被标记为deprecated未来版本将废弃届时可使用env包中的相应函数替代详见 console 包类定义。本文示例基于当前仓库实际 API 编写。读取标准输入stdIn当需要从标准输入流中获取数据时可以通过Console.stdIn来读取例如通过readln函数获取命令行的输入import std.console.* main() { let txt Console.stdIn.readln() println(txt ?? ) }运行上面的代码在命令行上输入一些文字然后换行结束即可在屏幕上看到输入的内容。从源码看Console.stdIn的类型是ConsoleReader其声明见 console 包类定义该类实现了InputStream接口提供了多种读取方式read(): ?Rune从标准输入中读取下一个字符输入不符合 UTF-8 编码时抛出IllegalArgumentExceptionread(arr: ArrayByte): Int64将读取的字节放入数组并返回字节长度注意可能将 UTF-8 码点从中截断导致转字符串结果不正确或抛异常readln(): ?String读取一行字符串结果不包含末尾换行符读取失败返回NonereadToEnd(): ?String读取所有字符直到 EOFLinux 键入CtrlD、Windows 键入CtrlZ加回车readUntil(predicate: (Rune) - Bool): ?String与readUntil(ch: Rune): ?String按条件或按终止字符读取。ConsoleReader只有一个实例所有方法共享同一个缓存区。读操作是同步的内部设有缓存区保存控制台输入内容当到达控制台输入流结尾时读取函数返回None。readln的返回值是?String可空类型因此上面的示例使用?? 提供缺省值。写入标准输出与标准错误stdOut / stdErr输出流分为标准输出流和标准错误流默认情况下它们都会输出到屏幕。当需要写入数据时可以通过Console.stdOut/Console.stdErr写入例如使用write/writeln函数向命令行打印内容import std.console.* main() { for (i in 0..1000) { Console.stdOut.writeln(hello, world!) } Console.stdOut.flush() }使用stdOut与直接使用print函数相比有两个显著差别并发安全ConsoleWriter保证线程安全每次write调用写到控制台的结果是完整的不同 write 调用之间的结果不会混合见 console 包类定义缓存与性能stdOut使用了缓存技术在输入内容较多时拥有更好的性能表现。需要注意写完数据后需要对stdOut调用flush才能保证内容被真正写到标准流中。这是因为ConsoleWriter的输出带有缓冲策略数据先进入缓冲区只有缓冲区被填满或主动调用flush时才真实写入这与OutputStream接口中flush的设计一致参见 I/O 接口定义。ConsoleWriter实现了OutputStream接口并提供了丰富的重载write/writeln支持ArrayByte、Bool、Float16/Float32/Float64、Int8/Int16/Int32/Int64、UInt8/.../UInt64、Rune、String以及泛型版本writeT(v: T) where T : ToString这意味着任何实现了ToString接口的自定义类型都可以直接写入标准流。参考 Console 官方示例一个完整的交互程序可以这样写import std.console.* main() { Console.stdOut.write(请输入信息1) var c Console.stdIn.readln() var r c.getOrThrow() Console.stdOut.writeln(输入的信息1为 r) Console.stdOut.write(请输入信息2) c Console.stdIn.readln() r c.getOrThrow() Console.stdOut.writeln(输入的信息2为 r) }运行结果用户依次输入两行内容请输入信息1你好请问今天星期几 输入的信息1为你好请问今天星期几 请输入信息2你好请问今天几号 输入的信息2为你好请问今天几号文件流基于 fs 包的统一文件系统接口仓颉编程语言提供了fs包来支持通用文件系统任务。不同操作系统对文件系统提供的接口有所不同仓颉抽象出共通功能通过统一接口屏蔽操作系统差异来简化使用当前支持 Linux、macOS、Windows 和 HarmonyOS 平台见 std.fs 包概览。常规操作任务包括创建文件/目录、读写文件、重命名或移动文件/目录、删除文件/目录、复制文件/目录、获取文件/目录元数据、检查文件/目录是否存在。使用文件系统相关功能需要导入fs包import std.fs.*File类型在仓颉编程语言中同时提供了常规文件操作和文件流两类功能。对于Path和Directory的使用可以查阅 fs 包 API。常规文件操作静态函数一族对于常规文件操作可以使用一系列静态函数完成快捷操作。检查文件是否存在使用exists函数返回true表示文件存在反之不存在。import std.fs.* main() { let exist exists(./tempFile.txt) println(exist: ${exist}) }移动、拷贝和删除文件File同样提供了对应的静态函数copy、rename、remove源码中它们实际上是fs包顶层函数见 fs 包函数定义import std.fs.* main() { copy(./tempFile.txt, to: ./tempFile2.txt, overwrite: false) rename(./tempFile2.txt, to: ./tempFile3.txt, overwrite: false) remove(./tempFile3.txt) }结合源码这三个函数的关键语义是copy(sourcePath, to!, overwrite! false)复制文件或目录。目标位置存在且overwrite为true时要求源与目标类型一致如源为目录则目标也须为目录overwrite为false且目标已存在时抛出FSExceptionrename(sourcePath, to!, overwrite! false)重命名或移动。overwrite为true时会删除目标位置的原有文件或目录若目标是目录会递归删除其中所有内容需谨慎使用remove(path, recursive! false)删除文件或目录删除文件夹时可选择是否递归。此外还有removeIfExists存在则删除并返回true、canonicalize规范化路径等函数可查阅 fs 包函数定义。一次性读写整个文件如果需要直接将文件的所有数据读出来或一次性将数据写入文件可以使用File提供的静态函数readFrom、writeToimport std.fs.* main() { let bytes File.readFrom(./tempFile.txt) // 一次性读取了所有的数据 File.writeTo(./otherFile.txt, bytes) // 把数据一次性写入另一个文件中 }从源码fs 包类定义看File.readFrom(path)以字节数组形式返回文件全部内容文件不存在或不可读时抛出FSExceptionFile.writeTo(path, buffer)以覆盖方式写入文件存在时会先截断为零字节大小文件不存在则创建配套的File.appendTo(path, buffer)以追加方式写入文件不存在则创建适合日志累加等场景。在数据量较少的情况下这类函数既简单易用又能提供较好的性能表现无需手动处理数据流但若要处理大文件或需要精细控制则应使用下面的文件流操作。文件流操作File 即数据流除了常规文件操作File类型本身也被设计为一种数据流类型实现了IOStream接口。当创建了一个File实例就可以把它当成数据流来使用。File 类定义见 fs 包类定义public class File : Resource IOStream Seekable { ... }这一声明揭示了三个关键能力Resource实现close()与isClosed()可配合 try-with-resource 语法自动释放资源见 core 包 Resource 接口IOStream同时具备InputStream.read与OutputStream.write/flush能力见 I/O 接口定义Seekable提供length、position、remainLength属性与seek函数支持移动读写光标配合SeekPosition枚举Begin、Current、End实现定位读取见 I/O 枚举定义。两种构造方式File提供了两种构造方式静态函数create直接创建新文件实例。注意create创建的文件是只写的不能对实例进行读操作否则会抛出运行时异常且当文件已存在或上级目录不存在时抛出FSException构造函数传入打开模式通过File(path, mode)构造新实例。File 构造示例// 创建 internal import std.fs.* internal import std.io.* main() { let file File.create(./tempFile.txt) file.write(hello, world!.toArray()) // 打开 let file2 File(./tempFile.txt, Read) let bytes readToEnd(file2) // 读取所有数据 println(bytes) }这里使用了std.io包提供的readToEnd(from)函数读取入参中所有未被读取的数据以字节数组返回见 io 包函数定义。io包还提供了readString校验 UTF-8、readStringUnchecked不校验、copy(from, to!)等流工具函数。OpenMode 打开模式当需要更精细的打开模式时可以使用构造函数传入一个OpenMode值。OpenMode是一个enum类型提供了丰富的文件打开模式见 fs 包枚举定义public enum OpenMode : ToString EquatableOpenMode { | Read | Write | Append | ReadWrite }模式语义Read只读方式打开。文件不存在时抛出FSExceptionWrite只写方式打开。文件存在时截断为零字节大小文件不存在则创建Append追加写入方式打开。文件不存在则创建写入位置始终在文件末尾ReadWrite可读可写方式打开。文件不存在则创建但不会将文件截断为零字节File 打开模式使用示例// 使用指定选项打开模式 let file File(./tempFile.txt, Write)资源释放与 try-with-resource打开File实例会占用宝贵的系统资源文件句柄使用完后需要及时关闭File以释放资源。File实现了Resource接口在大多数时候都可以使用try-with-resource语法来简化使用try (file2 File(./tempFile.txt, Read)) { ... // 结束使用后自动释放文件 }该语法会在代码块结束时自动调用close()释放文件即使块中抛出异常也会保证资源被关闭避免资源泄露。API 文档特别提醒创建的File对象会默认打开对应文件使用结束后需要及时调用close关闭文件见 fs 包类定义。流式读写综合示例参考 fs 包 File 官方示例可以综合看到四种OpenMode与SeekPosition、setLength的配合用法import std.fs.* import std.io.* main() { let filePath: Path Path(./tempFile.txt) if (exists(filePath)) { remove(filePath) } /* 以只写模式创建新文件写入三遍 123456789\n 并关闭 */ var file: File File(filePath, Write) let bytes: ArrayByte 123456789\n.toArray() for (_ in 0..3) { file.write(bytes) } file.close() /* 以追加模式打开写入 abcdefghi\n 并关闭 */ file File(filePath, Append) file.write(abcdefghi\n.toArray()) file.close() /* 以只读模式打开用 seek 定位后读取数据 */ file File(filePath, Read) let bytesBuf: ArrayByte ArrayByte(10, repeat: 0) file.seek(SeekPosition.Begin(10)) // 跳到文件头第 10 字节之后 file.read(bytesBuf) println(Data of the 10th byte after the 10th byte: ${String.fromUtf8(bytesBuf)}) file.seek(SeekPosition.End(-10)) // 跳到文件末尾前 10 字节 file.read(bytesBuf) println(Data of the last 10 bytes: ${String.fromUtf8(bytesBuf)}) file.close() /* 以读写模式打开截断并重写文件 */ file File(filePath, ReadWrite) file.setLength(0) // 截断文件大小为 0 file.write(The file was truncated to an empty file!.toArray()) file.seek(SeekPosition.Begin(0)) let allBytes: ArrayByte readToEnd(file) file.close() println(Data written newly: ${String.fromUtf8(allBytes)}) remove(filePath) }运行结果Data of the 10th byte after the 10th byte: 123456789 Data of the last 10 bytes: abcdefghi Data written newly: The file was truncated to an empty file!该示例展示了节点流在仓颉中的完整能力用Write创建并写文件、用Append追加、用Read配合SeekPosition定位读取、用ReadWrite配合setLength截断重写最后统一close并用remove清理。String.fromUtf8用于将字节数组还原为字符串显示。小结与最佳实践回到节点流的概念本质节点流直接对接外部资源是程序与外界数据交互的第一层通道。本文覆盖的两类节点流各有适用场景标准流面向命令行交互Console封装了并发安全与缓存优化stdIn提供readln等便捷读取接口stdOut/stdErr提供丰富的write/writeln重载写入后记得flush文件流面向持久化数据fs包统一屏蔽了跨平台差异。小数据量用File.readFrom/writeTo/appendTo静态函数一次搞定大数据量或需要精细控制时用File(path, OpenMode)构造流式实例配合read/write/seek/setLength操作并通过 try-with-resource 保证资源释放。在实际项目中通常还要将节点流与处理流如BufferedInputStream、StringReader等组合使用以进一步减少磁盘 I/O 次数、提升字符串处理性能相关用法可继续阅读 I/O 处理流。赞分享文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载相关推荐仓颉编程语言 I/O 节点流实战指南标准流与文件流仓颉编程语言 I/O 节点流实战指南标准流与文件流 节点流Node Stream是仓颉编程语言中直接连接外部数据源的流类型包括标准流标准输入/输出/错文档编程语言仓颉编程语言 I/O 节点流实战标准流与文件流的完整用法仓颉编程语言 I/O 节点流实战标准流与文件流的完整用法 节点流Node Stream是仓颉 I/O 体系中直接对接外部数据源的流类型涵盖标准流 Co文档编程语言仓颉编程语言 I/O 流全解析Stream 抽象、节点流与处理流实战指南仓颉编程语言 I/O 流全解析Stream 抽象、节点流与处理流实战指南 仓颉编程语言将所有与外部载体交互的操作抽象为基于数据流的 I/O 模型输入输出统一文档编程语言上一篇把多年的QQ空间说说一次留住GetQzonehistory一键批量导出说说、图片和评论下一篇Windows Defender恢复安全中心变灰3分钟修复创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LAMMPS bond_style mm3 键伸缩势详解:YAFF 包的 MM3 非谐势实现、参数配置与实战应用

LAMMPS bond_style mm3 键伸缩势详解:YAFF 包的 MM3 非谐势实现、参数配置与实战应用

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 导读 bond_style mm3 是 LAMMPS 中用于描述键伸缩运动的非谐势模型&…

2026/10/15 3:33:41 阅读更多 →
Flutter Engine Windows 无障碍实现解析:MSAA 与 UI Automation 在 AXPlatformNodeWin 中的落地

Flutter Engine Windows 无障碍实现解析:MSAA 与 UI Automation 在 AXPlatformNodeWin 中的落地

跨平台前端移动开发OpenHarmony 【免费下载链接】flutter_flutter 本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于…

2026/10/15 3:33:41 阅读更多 →
Natron ErodeSmooth 节点完全指南:归一化功率加权腐蚀/膨胀滤镜的参数解析与源码级解读

Natron ErodeSmooth 节点完全指南:归一化功率加权腐蚀/膨胀滤镜的参数解析与源码级解读

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/15 3:32:41 阅读更多 →

最新新闻

IDEA 2025.3 新功能实战:多光标、调试数据流与临时文件提升编码效率

IDEA 2025.3 新功能实战:多光标、调试数据流与临时文件提升编码效率

IDEA 2025.3 的更新日志刚出来那会儿,我真没当回事,毕竟每个大版本都爱说“更快、更智能、更好用”。直到上周把开发环境从旧版本升上来,试了一圈新功能,才意识到这波“骚操作”是真的多,甚至有点跟不上了。这篇文章不…

2026/10/15 4:27:50 阅读更多 →
贝叶斯网络学习指南:从结构、参数到推断的完整实践

贝叶斯网络学习指南:从结构、参数到推断的完整实践

简介:《贝叶斯网络学习指南》是一份面向机器学习、概率建模与数据科学初学者的PDF电子书,系统覆盖从概率论基础到贝叶斯网络建模、推理与参数学习的完整知识链。全书从概率函数与空间、条件概率与独立性、贝叶斯定理、随机变量及联合概率分布讲起&#x…

2026/10/15 4:27:50 阅读更多 →
STM32F072C8T6裸机开发实战:从寄存器到USB/CAN外设

STM32F072C8T6裸机开发实战:从寄存器到USB/CAN外设

简介:这份资料面向嵌入式初学者与有一定经验的开发者,围绕意法半导体STM32F072C8T6(ARM Cortex-M0内核、48MHz主频、32KB闪存与2KB RAM)学习板展开,帮助读者快速掌握该芯片的初始化配置、中断处理、内存管理及驱动编写…

2026/10/15 4:27:50 阅读更多 →
C/C++不同位数数据互转的进制转换实现与避坑指南

C/C++不同位数数据互转的进制转换实现与避坑指南

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

2026/10/15 4:27:50 阅读更多 →
NC65销售订单批量导入全攻略:从模板准备到成功入库的避坑指南

NC65销售订单批量导入全攻略:从模板准备到成功入库的避坑指南

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

2026/10/15 4:27:50 阅读更多 →
Linux下C/C++动静态库制作与使用实战指南

Linux下C/C++动静态库制作与使用实战指南

长期以来在Linux下做C/C开发,动静态库始终是绕不开的一个核心技能。无论是自己封装模块、分发二进制产物,还是处理第三方依赖,理解库的制作与使用直接决定了你在编译链接这块能不能少掉头发。我见过不少开发者写业务逻辑很熟练,一…

2026/10/15 4:26:50 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →