尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

download4cj断点续传源码剖析:BreakpointStoreOnCache如何记住每一个字节进度?

发布时间:2026/9/25 1:18:18

资讯中心
01
ARTICLE

download4cj断点续传源码剖析:BreakpointStoreOnCache如何记住每一个字节进度?

download4cj断点续传源码剖析:BreakpointStoreOnCache如何记住每一个字节进度?
download4cj断点续传源码剖析BreakpointStoreOnCache如何记住每一个字节进度【免费下载链接】download4cj一个文件下载库项目地址: https://gitcode.com/Cangjie-TPC/download4cjdownload4cj 是一个纯仓颉语言开发的高可靠下载引擎它的核心卖点之一就是断点续传下载中断后再执行同一任务能从上次停下的位置继续而不是从头再来。这份记忆由 BreakpointStoreOnCache 实现——它像一个内存账本精确记录每个分块已落盘的字节偏移。本文带你剖析这套机制的设计与实现。为什么断点续传要按块记字节下载大文件时download4cj 会把文件切成多个分块Block用多线程并发下载见 download_strategy.cj。每个分块有自己的起始偏移和长度下载进度不能只记总共下了多少而要精确到每个分块下到了第几个字节——否则恢复下载时不知道该从哪里补发Range请求。承载这份字节级进度的类是 BlockInfo它用AtomicInt64保存currentOffset多线程并发累加也线程安全getRangeLeft()返回的正是本块下一个要下载的字节位置。账本住在哪断点续传类关系中的 DownloadStore在类关系图中Download4cj核心类引用了DownloadStore它就是断点信息的存储位置而BreakpointStoreOnCache正是它的内存缓存实现isOnlyMemoryCache()返回true从核心类说明图可以看到DownloadStore 的定位就是download4cj 的存储器可存储在内存中或数据库——BreakpointStoreOnCache就是内存中这一支的实现账本里存了什么5 个关键成员BreakpointStoreOnCache内部用 5 个结构组成完整的任务台账见 break_point_store_on_cache.cj成员作用storedInfos主账本任务ID → BreakpointInfo保存 URL、文件名和全部分块的字节进度keyToIdMap任务特征 → 任务ID 的映射让相同任务秒认身份unStoredTasks已分配 ID 但进度尚未入账的新任务防并发下 ID 冲突sortedOccupiedIds已占用 ID 的有序列表用于回收ID 空洞fileDirtyList标记哪些任务的进度文件还是脏的等待清理BreakpointInfo是账本的一页见 break_ponit_info.cj记录id、url、文件名以及一个blockInfoList分块进度列表getTotalOffset()把所有分块的偏移相加就是整个任务已下载的总字节数。核心机制①落盘成功那一刻进度立即入账整个记住每一个字节的关键调用链是网络字节读入 MultiPointOutputStream按分块定位写入目标文件数据fsync确认落盘后回调 store.onSyncToFilesystemSuccess(info, blockIndex, bytes)该函数通过refEq确认传入的BreakpointInfo就是账本中同一对象然后对该分块执行increaseCurrentOffset底层是原子fetchAdd。也就是说只有操作系统确认字节真正写进文件之后账本里的偏移才会前进。哪怕进程此刻崩溃重新打开账本也不会出现账上 100 字节、文件里只有 60 字节的假进度。核心机制②恢复下载时怎么找回原来的任务再次调用同一任务的execute时入口是 findOrCreateId它按三步认人第一步查keyToIdMap命中则直接复用原 ID第二步遍历账本用isSameFrom比对 URL、父目录、文件名一致即认为是旧任务第三步再比对unStoredTasks中尚未入账的任务避免并发重复分配。找到旧 ID 后DownloadCall会依据账本里各分块的getRangeLeft()组装Range: bytesxxx-请求头见 header_interceptor.cj服务器就从断点位置回传数据——续传完成。如果发现文件已被远程更新BreakpointInterceptor 会对比Content-Range里的实例长度与账本长度不一致就触发downloadFromBeginning从头下载防止拼出新旧混合的坏文件。核心机制③ID 空洞回收账本不膨胀任务完成后onTaskEnd 只在EndCause.COMPLETED时调用remove清掉账目。而 allocateId 很讲究它扫描sortedOccupiedIds优先把中间空出来的 ID 填回去没有空洞才追加max1。这样长期运行的进程中 ID 始终紧凑有序不会无限增长。暂停—取消—续传的全局视角下面的时序图展示了DownloadTask.cancel()如何层层下发到DownloadChain中断各分块的写入再次execute/enqueue时各 Chain 从账本恢复、向目标文件续写。这正是BreakpointStoreOnCache记忆的使用现场相关源码速查断点存储接口src/break_point_store.cj落盘回调接口src/download_store.cj内存缓存实现src/break_point_store_on_cache.cj分块字节进度src/block_info.cj断点信息页src/break_ponit_info.cj续传 Range 头组装src/header_interceptor.cj断点拦截器长度校验/从断点恢复src/break_point_interceptor.cj多分块输出流src/multi_point_output_stream.cj功能接口文档doc/feature_api.md一句话总结BreakpointStoreOnCache用ID 台账 分块原子偏移 落盘后记账三板斧让 download4cj 的断点续传精确到每一个字节而且崩溃恢复后依然可靠。【免费下载链接】download4cj一个文件下载库项目地址: https://gitcode.com/Cangjie-TPC/download4cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。