• 怎么断点续传?
    两点:
    1、网络数据(可以设置从文件的哪个位置下载)
    conn.setRequestProperty(“Range”, “bytes=”+startPos+”-“+endPos);
    2、写入文件(可以设置从本地文件哪个位置写入)
    使用RandomAccessFile.seek

  • 单个文件怎么分段下载?

得到文件的总长度,把长度分为N个线程进行分开下载

1、RandomAccessFile 实现断点续传:

断点 : 当前线程已经下载完成的数据长度。
续传 : 向服务器请求上次线程停止位置之后的数据。
每当线程停止时就把已下载的数据长度写入记录文件,
当重新下载时,从记录文件读取已经下载了的长度。而这个长度就是所需要的断点

续传的实现也简单,可以通过设置网络请求参数,请求服务器从指定的位置开始读取数据。
而要实现这两个功能只需要使用到httpURLconnection里面的setRequestProperty方法便可以实现

如下所示,便是向服务器请求500-1000之间的500个byte:

conn.setRequestProperty("Range", "bytes=" + 500 + "-" + 1000);

以上只是续传的一部分需求,当我们获取到下载数据时,还需要将数据写入文件,
而普通发File对象并不提供从指定位置写入数据的功能,这个时候,就需要使用到
RandomAccessFile来实现从指定位置给文件写入数据的功能

如下所示,便是从文件的的第100个byte后开始写入数据。

raFile.seek(100);

开始写入数据时还需要用到RandomAccessFile里面的另外一个方法

public void write(byte[] buffer, int byteOffset, int byteCount)

该方法的使用和OutputStream的write的使用一模一样…
以上便是断点续传的原理

具体代码:

                URL url = new URL(threadInfo.getUrl());connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);connection.setRequestMethod("GET");int start = threadInfo.getStart() + threadInfo.getFinished();//设置范围connection.setRequestProperty("Range", "bytes=" + start + "-" + threadInfo.getEnd());//设置文件写入位置File file = new File(DownLoadService.DOWNLOAD_PATH, fileInfo.getFileName());randomAccessFile = new RandomAccessFile(file, "rwd");randomAccessFile.seek(start);//暂停之前的数据进行累加currentProgress += threadInfo.getFinished();

代码中重要的2个方法是

//设置开始和结束的范围,每次暂停后,从上一次的进度开始下载
connection.setRequestProperty("Range", "bytes=" + start + "-" + threadInfo.getEnd());

//从指定位置进行下载randomAccessFile.seek(start);

2、多线程对大文件进行分段下载:

多线程断点续传是把整个文件分割成几个部分,每个部分由一条线程执行下载,而每一条下载线程都要实现断点续传功能。
为了实现文件分割功能,我们需要使用到httpURLconnection的另外一个方法:

public int getContentLength()

当请求成功时,可以通过该方法获取到文件的总长度。 每一条线程下载大小 =
fileLength / THREAD_NUM

在多线程断点续传下载中,有一点需要特别注意: 由于文件是分成多个部分是被不
同的线程的同时下载的,这就需要,每一条线程都分别需要有一个断点记录,和一
个线程完成状态的记录;

关键代码:

    //线程数量private int mThreadCount = 3;//下载的文件的总长度private int length ;//多线程下载//获得每个线程下载长度int childLength = length / mThreadCount;//线程一:0,childLength //线程二:childLength, childLength*2//线程三:childLength*2,childLength*3int start = childLength * i;int end = (i + 1) * childLength - 1;for (int i = 0; i < mThreadCount; i++) {ThreadInfo threadInfo = new ThreadInfo(i, fileInfo.getUrl(), start , end , fileInfo.getFinished());//最后一个除不尽的情况if (i == mThreadCount - 1) {threadInfo.setEnd(fileInfo.getLength());}//在循环中直接开启线程进行下载DownloadThread downloadThread = new DownloadThread(threadInfo);downloadThread.start();}//实体类
public class ThreadInfo implements Serializable{public static final String THREAD_INFO = "thread_info";private int id;//下载的URLprivate String url;//下载开始节点private int start;//下载结束节点private int end;//当前完成进度private int finished;public ThreadInfo(int id, String url, int start, int end, int finished) {this.id = id;this.url = url;this.start = start;this.end = end;this.finished = finished;}

总结:

真正实现的时候最好使用:
1、线程池控制多个线程
2、采用同步数据库方法
3、采用Service中启动线程下载

为什么要在Service中做下载,而不在Activity中下载?

Activity是一个前台组件,可能会被关闭,也可能会被android系统回收。如果activity关闭了,在activity中创建线程就不好管理了,没法停止和其他操作。

Service属于后台组件,用户没法去关闭,优先级高,一般Android系统不会去回收的。
线程的启动关闭在Service中是比较保险的。

RandomAccessFile断点续传和多线程断点续传(大文件分段下载)总结相关推荐

  1. c#.Net MVC服务端下载文件、限制下载速度、大文件下载、对性能的影响、对大文件的支持、对断点续传和多线程下载的支持

    一.ASP.NET文件下载各种方式比较:对性能的影响.对大文件的支持.对断点续传和多线程下载的支持 asp.net里提供了多种方式,从服务器端向客户端写文件流,实现客户端下载文件.这种技术在做防下载系 ...

  2. android多线程下载原理,安卓多线程断点续传下载功能(靠谱第三方组件,原理demo)...

    一,原生的DownloadManager 从Android 2.3(API level 9)开始,Android以Service的方式提供了全局的DownloadManager来系统级地优化处理长时间 ...

  3. android 多线程断点续传下载

    今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  4. android 多文件多线程断点续传下载

    今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  5. Android进阶:多线程断点续传下载

    今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的. 什么是多线程下载? 多线程下载其实就是迅雷, ...

  6. 多线程断点续传后台下载(首发于安卓巴士)

     本菜鸟最近在做一个小项目,项目中用到了多线程断点续传的功能,因为是菜鸟嘛,所以在网络上找了很多教程,不过大多教程只给出了源码,注释跟说明实在太少,也许大牛们不需要太多的解释,可是就苦了小菜们了.本着 ...

  7. 多线程断点续传后台下载

    本菜鸟最近在做一个小项目,项目中用到了多线程断点续传的功能,因为是菜鸟嘛,所以在网络上找了很多教程,不过大多教程只给出了源码,注释跟说明实在太少,也许大牛们不需要太多的解释,可是就苦了小菜们了.本着技 ...

  8. 撸了个多线程断点续传下载器,我从中学习到了这些知识(附开源地址)

    2020年6月20日 上海张江 感谢看客老爷点进来了,周末闲来无事,想起同事强哥的那句话:"你有没有玩过断点续传?" 当时转念一想,断点续传下载用的确实不少,具体细节嘛,真的没有去 ...

  9. 图解:HTTP 范围请求,助力断点续传,多线程下载的核心原理 | 实用HTTP

    点击上方蓝字"承香墨影",关注我! 题图:by Charles Loyer 一.序 Hi,大家好,我是承香墨影! HTTP 协议在网络知识中占据了重要的地位,HTTP 协议最基础的 ...

最新文章

  1. netty:IO模型
  2. cent 8.0 安装tomcat 9.0_JDK-TOMCAT-MYSQL安装
  3. MySQL之事务隔离级别--转载
  4. html5语义化布局分割代码,HTML5语义化标签布局的兼容性.html
  5. PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
  6. java猴子吃香蕉_Java 猴子分香蕉
  7. 字魂35号经典雅黑_2020:上海不锈钢黑钛线条行业
  8. OpenVINO InferenceEngine之CNNNet、CNNLayer、Blob介绍
  9. 云服务器安装其他版本系统,云服务器安装自己的系统版本
  10. STM32 存在字节对齐指针变量的地址都必须是4的倍数
  11. 12GB内存版华为P30、P30 Pro工信部入网:售价或将突破7000元
  12. java web 收发邮件_Java总结(五)之实现javaweb发送邮件
  13. 2019小程序没必要做了_2019年什么行业适合做小程序
  14. spring cloud报错解决:java.lang.ClassNotFoundException: com.netflix.servo.monitor.Monitors
  15. python网页抓取与按键精灵原理一样吗_Python——爬虫——爬虫的原理与数据抓取...
  16. python 开机自动切换必应壁纸
  17. MongoDB 索引(一)
  18. 【渗透测试】VulnHub-Lord Of The Root: 1.0.1
  19. Typora页内跳转 ,亲测有效
  20. 涅槃重生,力荐大型分布式手册,凤凰架构让你浴火成神,良心分享

热门文章

  1. 连接数据库出现:Connections could not be acquired from the underlying database
  2. Spring动态代理使用
  3. java操作华为OBS对象存储服务器
  4. 回顾我的程序员之路,那些得与失,幸福与心酸
  5. access后台链接mysql_让开发平台支持连接Mysql后台数据库
  6. 特色功能(锐捷云桌面篇)
  7. 大白菜装win10专业版启动u盘制作教程
  8. pygame 游戏开发 基础物理建模 重力系统模拟
  9. Kuberntes云原生实战04 安装前置条件及Docker环境
  10. Arduino制作温湿度计