断点续传原理
一、从上次的位置继续下载。
二、从上次写入的文件继续写入。
第一点,通过Http的GET请求中的setRequestProperty("Range", "bytes=" + 开始位置+ "-" + "结束位置")方法
第二点,通过RandomAccessFile可以在本地文件中继续写入文件。因此,实现断点续传我们可以按照以下步骤。
1.首先获取要下载的文件长度,用来设置RandomAccessFile(本地文件)的长度。
2.实时保存文件下载进度,这个功能我们可以用数据库来实现。
3.中断后再次下载时,读取进度,再从上次的下载进度继续下载,并在本地的文件继续写入。
多线程结合断点续传下载
多线程无非是将待下载的文件分成若干个部分进行下载并实现断点续传。
1.同样,我们首先要获取待下载的文件的长度,用来为每个线程分配下载长度。通过HttpURLConnection.getContentLength()获取待下载的文件的长度。如下:
filesize=connection.getContentLength();
2.通过前面获取的下载文件的长度,为每个线程计算下载长度,即为每个线程设置下载的起始位置跟结束位置。通过HttpUrlConnection.setRequestProperty("Range", "bytes=" + 开始位置+ "-" + "结束位置")方法。如下图所示:
计算方法如下:
int block = (filesize % threadCount == 0) ? filesize / threadCount : filesize / threadCount + 1;
所以每个线程对应的起始位置跟结束位置分别为:i block, (i + 1) block(i从0开始)
3.通过RandomAccessFile可以在文件指定位置写入数据。如下:
mRandomAccessFile.seek(startPos)
4.为每个线程的下载的进度都保存数据,这样每次每次暂停后重新下载都重新读取下载进度,并且可以从上次位置重新下载。并且再本地文件中继续读入数据。