Java 实现多线程断点下载原理

来源:互联网 发布:手机定位软件破解版 编辑:程序博客网 时间:2024/05/18 00:56

Java 实现多线程断点下载原理


说明:

1.本文是对如何实现多线程断点下载的原理进行简单的分析;

2.本文并未附上源代码,因此对其中的一些细节性处理未作详细阐述;

3.www.github.com上的xUtils开源框架中封装的有多线程下载的源代码实现,可自行免费下载.

正文:

多线程下载简单来说就是开启多个线程同时下载同一个文件,每个线程只下载文件的一部分,所有线程都下载成功后即可得到完整的下载文件.

a.简单起见,若开启多条(num)线程同步下载,则可将网络上的源文件等分成num份,每条线程下载其中一份

b.首先获取到网络源文件的大小(size),单位为字节,则每个线程下载的起始和末尾字节数可按如下规则进行设置:

基准      base = size / num线程    开始位置(startSize)    结束位置(endSize)线程0     base * 0        ~   base * 1 - 1 线程1     base * 1        ~   base * 2 - 1 线程2     base * 2        ~   base * 3 - 1                 .           .                .           .线程n - 1 base * (n - 1)  ~   base * n - 1 线程n     base * n        ~   base * (n + 1)- 1                 .           .                .           .一般情况,即size不能被num整除,则可使最后一条线程end(第num-1条线程)下载的范围为线程end base * end        ~   size - 1说明:文件的开始索引是从0开始的,大小为size的文件的结束索引为(size-1),因此线程设置时也从0开始计算第几条线程

c.使用 RandomAccessFile 进行文件的下载操作

RandomAccessFile类的API简介:此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入(rw)模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。理解:通过RandomAccessFile可改变一个文件指定范围类的字节而不影响该文件的其它字节,及该文件的大小和属性等

d.多线程下载具体实现过程原理分析

1)获取下载文件的大小(size)2)创建RandomAccessFile类对象,确定下载文件储存路径,文件名,然后指定文件大小为size3)循环开启num个线程,并根据上面规则设置开始下载位置(startSize)和结束下载位置(endSize)4)在每个线程中可通过方法    setRequestProperty("Range", "bytes=" + startSize+ "-" + endSize)向服务器告知当前线程要下载的该文件的开始和结束位置5)通过RandomAccessFile类对象下载,并将内容写到上面创建的文件对象中

e.断点下载实现过程原理分析

理解:RandomAccessFile可对文件进行指定位置的字节写入而不改变该文件的其它部分,因此可以记录上次异常终止的位置,然后下次开启时从上次终止的位置下载即可实现过程:1)定义一个变量count,初始值为该线程下载的起始位置startSize,然后在下载过程中,每次将一个byte[n]数组的字节写入文件后即将count的值加上n;然后将count的值写入一个缓存文件中2)若程序异常终止,再次开启时,先判断是否存在该线程的count的缓存文件,若有,先读取缓存文件中的count值,然后从count的位置下载即可

f.细节处理

本文只是对多线程断点下载的实现原理进行简单的分析,对其中一些具体的实现过程和细节,如:    1)下载文件的名字如何实现自动命名(即与服务器上的文件名字一样)    2)下载前判断该文件是否已经下载过    3)下载完成后对缓存文件的处理等不进行详细分析,感兴趣者可参考xUtils中的源码

g.API需求

1)网络URL及相关联的其它类2)RandomAccessFile(重点理解该类对文件读写特殊的操作方式)
0 0
原创粉丝点击