多线程断点续传下载器 - Multi-threaded downloader with resume support
一个基于 Java 的多线程 HTTP/HTTPS 文件下载工具,支持断点续传、分块下载和实时进度显示。
- 🚀 多线程下载:支持多个线程同时下载文件的不同分块,提升下载速度
- 🔄 断点续传:下载中断后可从已下载位置继续,无需重新开始
- 📊 实时进度:每秒显示下载进度、速度和剩余时间
- 🔒 线程安全:使用
LongAdder保证多线程环境下的计数准确性 - ✅ 完整性验证:下载完成后自动验证文件大小,确保数据完整
- 🎯 智能重试:检测未完成文件并自动继续下载
- 语言:Java 8+
- 核心库:
java.net.HttpsURLConnection- HTTP 连接java.util.concurrent- 线程池管理java.io.RandomAccessFile- 文件随机访问java.util.concurrent.atomic.LongAdder- 线程安全计数器
PowerDownLoad/ ├ ── src/com/bipowerdownlaod/ │ ├── Main.java # 主入口类 │ ├── Constant/ │ │ └── constant.java # 常量配置 │ ├── core/ │ │ ├── Downloader.java # 下载调度器 │ │ ├── DownloaderTask.java # 下载任务(Callable) │ │ └── DownloadInfoThread.java # 进度监控线程 │ └── util/ │ ├── HttpUtils.java # HTTP 工具类 │ ├── FileUtils.java # 文件工具类 │ └── LogUtils.java # 日志工具类 ├── 实验下载检测包/ # 下载文件保存目录(已在 .gitignore 中忽略) └── README.md
请输入下载地址: https://example.com/largefile.zip
开始下载... URL: https://example.com/largefile.zip 文件名: largefile.zip 保存路径: E:\downloads
分块 0:0 - 20971520 分块 1:20971521 - 41943041 分块 2:41943042 - 62914562 分块 3:62914563 - 83886083 分块 4:83886084 - 文件末尾
已下载:50.25MB/295.71MB (16.99%) 5488kb/s 剩余:45.2s 已下载:100.50MB/295.71MB (33.98%) 5600kb/s 剩余:35.1s ...
线程 0 下载完成,写入 20971521 bytes (0 - 20971520) 线程 2 下载完成,写入 20971521 bytes (41943042 - 62914562) ...
下载完成 ✅ 文件下载成功,大小验证通过! 下载完成,耗时:0时 1分 30秒
- 文件分块:将文件平均分成 N 个块(N = 线程数)
- 并行下载:每个线程负责一个分块的下载
- RandomAccessFile:使用
seek()定位到对应位置写入数据 - Range 头:HTTP Range 请求指定字节范围
- 检测本地文件大小
- 如果文件部分存在,从已完成位置继续下载
- 使用
finishSize记录已下载部分 - 重新计算剩余分块
- 独立的定时线程每秒执行一次
- 计算瞬时速度、剩余时间、下载百分比
- 使用
volatile保证变量可见性
- 路径配置:首次使用前请修改
constant.java中的PATH为你的下载目录 - 线程数选择:线程数不是越多越好,建议 3-8 个,根据网络情况调整
- 服务器支持:需要服务器支持 HTTP Range 请求才能实现分块下载
- 磁盘空间:确保有足够的磁盘空间存储下载文件
- 静态计数器在多次调用时需要手动重置
- 暂不支持动态调整线程数
- 暂无暂停/恢复功能(仅支持断点续传)
本项目仅供学习交流使用。
Built with ❤️ by Bipowerdownlaod
⭐ 如果这个项目对你有帮助,请给个 Star!