多线程断点下载
发表于:,更新于:,By Sally
多线程断点下载原理
原理
开启的线程数为 threadCound = 3
每个线程下载的大小为 blockSize = 3
要下载文件的总大小为 size = 10
线程号 | | 下载开始位置 | | 下载结束位置 | | eg |
---|---|---|---|
0 | 0*blockSize | 1*blockSize - 1 | 0 - 2 |
1 | 1*blockSize | 2*blockSize - 1 | 3 - 5 |
2 | 2*blockSize | size | 6 - 9 |
server端处理思路
获得目标文件的大小
根据开启线程的个数,执行下载操作
这里需要用到
RandomAccessFile
这个随机读写文件
的类,- 该类可以创建指定大小的空白文件
- 该类还能指定文件读写的位置
- 该类在创建对象时,可以指定文件的操作模式(r, rw, rwd, rws)
- 因为有了文件的操作模式,所以该类会实时的刷新文件到底层的存储设备,而不像一般的文件操作类的flush()动作,只是将读到的文件刷新到硬盘的缓冲区
http协议
这里需要用到一个http 协议,Range 指定读取服务器端文件的位置
HttpUrlConnection.setRequestProperties("Range", "byte=startIndex-endIndex");
client端处理思路
创建一个与目标文件一样大小的空白文件
开启若干个线程,执行下载
待所有的线程都下载完毕,则该文件下载完成,这时才可以删除设置断点的临时文件
删除临时文件时,注意线程安全
实现断点下载
实时的将当前线程的下载进度(已下载文件的大小)写入到文件中
如果一次没有下载完,再次下载时,应该从上次下载的位置开始下载(即:文件的开始下载位置以及已下载文件的总大小需要实时记录)
直到所有的线程都下载完毕,才能将所有临时存储的下载文件的大小删除 (这里注意:线程安全问题,需要加锁)
知识点补充
http请求的一个设置信息
setRequestProperties("Range", "byte=startIndex-endIndex")
文件的读写位置都是从
0
开始的http协议 : 服务器返回的文件,该文件的读写位置也是从
0
开始的RandomAccessFile 的读写模式
r
,rw
,rwd
,rws
- r : 以只读方式打开,调用结果对象的人和write方法都会抛出IOException异常
- rw : 打开以便读取和写入,如果该文件不存在,则尝试创建该文件
- rws : 打开以便读取和写入,对于’rw’,还要求对文件内容和元数据的每个更新都同步写入到底层存储设备
- rwd : 打开以便读取和写入,对于’rw’,还要求对文件内容的每个更新都同步写入到底层存储设备
代码
- 主函数
1 | public class DownLoadDemo { |
- 启动线程,执行下载
1 | /** |