多线程断点续传下载关键点解析

何为多线程断点续传下载

将一个文件分成多个不同的部分,每个部分都由一个线程去下载,而且这些线程的下载是同时进行的,并且在下载被中断的时候,将文件下载的信息存储到本地数据库中,在下次下载的时候,接着上次下载的地方继续下载。

关键技术点解析

1. 获取下载文件的长度,并设置本地文件的长度

关键类 HttpURLConnection 和 RandomAccessFile

conn.getContentLength();     //获取下载文件长度,单位byte
raf = new RandomAccessFile(file, "rwd");
raf.setLength(length);       //设置本地文件长度
2. 根据文件长度和线程数,计算每条线程下载的数据长度和位置
int len = (int) mFileInfo.getLength() / threadCount;
for (int i = 0; i < threadCount; i++) {
    ThreadInfo threadInfo = new ThreadInfo();
    threadInfo.setStart(i * len);
    threadInfo.setEnd((i + 1) * len - 1);
    if (i == threadCount - 1) {
        threadInfo.setEnd(mFileInfo.getLength());
    }
}
3. 使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止
 long start = mThreadInfo.getStart() + mThreadInfo.getFinished();
 conn.setRequestProperty("Range", "bytes=" + start + "-" + mThreadInfo.getEnd());
4. 保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。
raf = new RandomAccessFile(file, "rwd");
raf.seek(start);
5. 利用数据库保存线程下载的信息

断点续传
就是信号中断后(掉线或关机等),下次能够从上次的地方接着传送(一般指下载或上传)

前四点,讲述了如何进行多线程下载,但并不能做到断点续传,而如果想实现断点续传,就需要利用SQLite数据库,在中断的时候,将文件下载的进度存储到数据库中,方便下次从数据库记录的位置开始下载

mDao.updateThread(mThreadInfo.getUrl(),mThreadInfo.getId(), mThreadInfo.getFinished());
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容