美文网首页
多线程断点续传下载关键点解析

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

作者: sofarsogoo_932d | 来源:发表于2018-03-27 13:59 被阅读0次

    何为多线程断点续传下载

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

    关键技术点解析

    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());

    相关文章

      网友评论

          本文标题:多线程断点续传下载关键点解析

          本文链接:https://www.haomeiwen.com/subject/titgpxtx.html