何为多线程断点续传下载
将一个文件分成多个不同的部分,每个部分都由一个线程去下载,而且这些线程的下载是同时进行的,并且在下载被中断的时候,将文件下载的信息存储到本地数据库中,在下次下载的时候,接着上次下载的地方继续下载。
关键技术点解析
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());