美文网首页网络
Http文件下载、限速、断点续传

Http文件下载、限速、断点续传

作者: Tyhj | 来源:发表于2019-09-20 17:36 被阅读0次

关键点

1.文件下载使用原生的HttpURLConnection来下载,获取输入流保存到本地文件就可以了;
2.限速可以在读取输入流的时候设置时间间隔,每一秒只读取固定的大小即可实现限速效果;
3.断点续传需要在取消下载的时候记录这个文件路径,再次下载的时候如果记录中有这个文件则继续从文件末尾开始读写,请求文件的时候需要在HTTP请求里面设置参数,告诉服务器跳过已下载部分(即跳过本地文件大小的字节)

具体实现

获取输入流

首先新建HttpDownloadImpl类,实现接口,实现下载方法,打开URL获取文件输入流

    String urlStr = fileUrl;
    HttpURLConnection conn = null;
    InputStream inputStream = null;
    url = new URL(urlStr);
    conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(CONNECT_TIME_OUT);
     // 得到输入流
    inputStream = conn.getInputStream();

写入到本地文件

写入到本地文件很简单,根据本地文件创建输出流从输入流读取数据循环写入即可

OutputStream outputStream = new FileOutputStream(new File(savePath));
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
while (read != -1) {
outputStream.write(bytes,0,read);
read = inputStream.read(bytes);
}

下载限速

做下载限速就需要控制while循环里面的输入流的读取速度,方法很简单,如果在单位时间内,下载速度已经达到了限速的大小,则等待剩下的时间

        //increment为每次下载的大小,downLoadSize为累计下载大小
        downLoadSize = downLoadSize + increment;
        //限制下载速度
        if (downLoadSize - speedLastDownloadSize >= transferSpeed) {
            long interval = System.currentTimeMillis() - speedLimitLasttime;
            //间隔时间小于单位时间,等待剩余的时间
            if (interval < speedLimitTime) {
                try {
                    Thread.sleep(speedLimitTime - interval);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            speedLastDownloadSize = downLoadSize;
            speedLimitLasttime = System.currentTimeMillis();
        }

获取下载进度

获取下载进度比较简单,获取到文件的总大小和当前累计的下载大小即可

//下载的文件大小
int contentLength = conn.getContentLength();

暂停、继续下载

暂停下载也比较简单,只需要在循环读取数据里面添加一个boolean类型的变量即可控制暂停或者继续下载了

断点续传

断点续传其实很简单,关键在于两点,一是写入文件的时候需要跳到文件的末尾继续进行写入,二是HTTP获取输入流的时候需要通知服务器只传文件未下载的部分;至于下载了多少不需要保存,只需要从已下载的文件读取即可,所以需要记录一下哪些文件是未下载完需要继续下载的;

 //文件已下载大小
downloadedLength = newFile.length();
 //请求断点续传
conn.setRequestProperty("RANGE", "bytes=" + downloadedLength);
//定义RandomAccessFile类
 RandomAccessFile outputStream = null;
 outputStream = new RandomAccessFile(newFile, "rw");
 //设置从文件指定位置读取
 outputStream.seek(downloadedLength);

相关文章

  • Http文件下载、限速、断点续传

    关键点 1.文件下载使用原生的HttpURLConnection来下载,获取输入流保存到本地文件就可以了;2.限速...

  • AFN下载文件解压文件及断点续传

    下载文件及断点续传:http://www.cnblogs.com/qingche/p/5362592.html 下...

  • Android下载文件(一)下载进度&断点续传

    索引 Android下载文件(一)下载进度&断点续传 Android下载文件(二)多线程并发&断点续传(待续) A...

  • HTTP断点续传原理: Range & Content-Rang

    所谓断点续传, 也就是要从文件已经下载的地方开始继续下载. 在以前版本的 HTTP 协议是不支持断点的, HTTP...

  • 断点续传or断电续传?!!

    所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1....

  • NSURLSession实现断点下载

    断点续传概述 断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头。(本文的断点续传仅涉及下载...

  • IOS 断点续传原理浅析(第一篇)

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • iOS-16 断点续传 下载

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • 断点上传

    一、断点上传辨义 在 Http 协议之下的 文件下载有“断点续传”功能,从服务器到客户端的文件下载可行,而对Htt...

  • android 中断点续传

    android 中断点续传 单线程断点续传 所谓的断点续传就是在下载一个文件时,文件没有完全下载,中途暂停,那么再...

网友评论

    本文标题:Http文件下载、限速、断点续传

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