前言

最近要在安卓里面下载大文件,考虑到现场网络和使用的情况,如果简单http下载的话,很有可能下载崩溃或者中断失败。
原本想用wget做断点续传的,这样就简单很多,但是安卓不给运行wget


一、什么是分段下载?

简单来说就是把文件分拆开来,一块一块的下载,这样速度会有所损失,但胜在可控、健壮
在http里面,主要是请求头:Range

下面看一下Range字段常用表示的写法:
Range: bytes=0-1024 获取最前面1025个字节
Range: bytes=-500   获取最后500个字节
Range: bytes=1025-  获取从1025开始到文件末尾所有的字节
Range: 0-0          获取第一个字节
Range: -1           获取最后一个字节
例如,在一个请求头中有Range:byte=0-1024,那么表示的意思就是请求数据的前1025个字节。如果这个分段请求的返回码是206,并且指示的分段范围是0-1024,文件的总大小是7877,那么在响应头中的数据应该表示为:
Content-Range: bytes 0-1024/7877

二、使用方法

直接上代码

package com.kl;import com.kl.utils.IOUtils;
import com.kl.utils.Logx;import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;class _DownLoadThread implements Runnable
{private String _url = "";private String _local = "";private long _len = 0;public _DownLoadThread(String url, String local, long len){_url = url;_local = local;_len = len;new Thread(this).start();}@Overridepublic void run(){long start, end, n = 0;long size = 1024 * 1024 * 50;start = 0;_len--;Logx.log("load: " + _url);while (start < _len){Logx.log("load process: " + start);end = Math.min(start + size-1, _len);if( down(start, end) ){n = 0;start += size;}else n++;if( n > 10 ){Logx.log("error, retry too many: " + _url);break;}}if( n==0 ){Logx.log("load complete");NoticeUIChange.ins().newOk();}NoticeUIChange.ins().removeNew();}private boolean down(long startIndex, long endIndex){HttpURLConnection conn = null;InputStream is = null;RandomAccessFile raf = null;try{URL url = new URL(_url);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//请求服务器下载部分的文件的指定位置conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex);conn.setConnectTimeout(5000);is = conn.getInputStream();//返回资源raf = new RandomAccessFile(_local, "rwd");raf.seek(startIndex);//定位文件int len = 0;byte[] buffer = new byte[1024];while ((len = is.read(buffer)) != -1) {raf.write(buffer, 0, len);}is.close();raf.close();is = null;raf = null;return true;}catch (Exception e){e.printStackTrace();}finally{if( is != null ) IOUtils.closeQuietly(is);if(raf != null) IOUtils.closeQuietly(raf);if( conn != null ){try{ conn.disconnect(); } catch (Exception e){}}}return false;}
}

里面的Logx类是日志类,可以都删掉或者替换自己的
IOUtils:

public class IOUtils
{public static void closeQuietly(Closeable close){if( close != null ){try{close.close();}catch (Exception er){}}}
}

总结

本文实现的是单线程下载,考虑现场的情况,多线程反而会出问题。如果想要多现场下载,改装下下载类就行

Http分段下载实现相关推荐

  1. EtherCAT SDO分段下载/上传说明

    ETherCAT COE (CANOpen)的 SDO   属于应用层通讯协议,基于同步管理器(SM)的邮箱实现的,主站可以通过SDO实现一下功能. 对应邮箱消息数据格式如下 其中分段下载和分段上传请 ...

  2. python实现多线程下载_多线程分段下载研究的python实现(一)

    我一直对下载文件比较感兴趣.现在我下载文件大部分是用迅雷,但迅雷也有一些不如意的地方,内存占用大,一些不必要的功能太多,不可定制.尤其是最后一点.现在有些下载对useragent,cookie,aut ...

  3. 聊聊视频分段下载的思路

    很多优酷网的视频,都是被分拆成多段的.最近做项目,需要在线播放分段和下载视频.播放分段视频,其实就是常说的m3u的概念,把各个分段的地址做成一个播放列表,播放器把所有分段当作一个完整的视频.在播放过程 ...

  4. 例程五、HTTP Range使用 分段下载 与 下载后c语言合成例程 以照片为例

    1. HTTP分段下载 可靠reference: https://www.bbsmax.com/A/gVdnERW15W/ https://developer.mozilla.org/zh-CN/do ...

  5. php 分段下载文件,php如何实现自动分段下载文件(代码示例)

    本篇文章给大家带来的内容是关于php如何实现自动分段下载文件(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.function download($file_dir,$fi ...

  6. Java后端接口返回视频流,使用video组件播放视频,实现分段下载

    视频文件保存在不为人知的地方,总之前端不能直接访问的位置,需要通过后端接口取出来再返回给前端. 前端这样子播放 <video controls="controls" cont ...

  7. AmazonS3 、大文件、分段上传、分段下载,上传下载超时,java.net.SocketTimeoutException问题

    关于分段下载 客户端请求时:在请求头上增加range属性:bytes=fromByte-toByte. 如 值为bytes=100-200 服务端响应时:指定响应status=206,Content- ...

  8. golang协程分段下载文件

    目录 golang协程 加锁示例 golang协程分段下载文件 golang协程 golang协程分段下载文件,为了提升性能,更好的利用golang协程的特性,我们开始使用他测试一下我们的程序 gol ...

  9. github分段下载

    git由于找不到断点续传功能,而网络又经常很差,所以要想办法一点点下载下来,看到别人给的一些建议,整理一下 先手动创建工程 我这里是下载工程https://github.com/apache/incu ...

  10. vue-video-player,springboot实现视频分段下载播放

    事情的起因是在博主把项目部署到服务器上后,发现由于视频太大,加上服务器太垃圾,导致稍微大点的视频加载很久才能播放(指十多分钟-),然后就上网查找资料,看下咋实现. 这里涉及到有关http请求的知识&q ...

最新文章

  1. php简单文章,php编写简单的文章发布程序
  2. 单数组去重(日常记录)
  3. 微软System Center 2012推进私有云计算
  4. 文本编辑器左边显示行数
  5. 为什么说dubbo的声明式缓存不好用!!!
  6. 在 xml 视图里指定 SAP UI5 VizType 实例
  7. echarts图表的内边距_echarts——各个配置项详细说明总结
  8. angular五大服务顺序,angularJS $事件处理程序的触发顺序
  9. Linux连接xshell时连不上的问题【转载】
  10. CVPR 2019 Oral | 华科开源效果超群的人体姿态迁移算法
  11. 20145234黄斐《java程序设计》第十三周代码检查
  12. 【XML】我所知道的XML
  13. 企业微信api消息接口调用
  14. 如何让微信好友永远拉黑不了你?
  15. Linux入门基础学习参考资料
  16. 【科普】码农是程序员吗?码农与真正程序员的区别是啥?
  17. MySQL删除表的三种方式
  18. Shiro 通过配置Cookie 解决多个二级域名的单点登录问题。
  19. GraphQL实战-第一篇-GraphQL介绍
  20. axure低保真原型_如何在Google表格中创建低保真原型

热门文章

  1. 福特dms系统服务器,长安福特DMS使用规范.pdf
  2. asc怎么用 linux zip_asc文件扩展名,asc文件怎么打开?
  3. 【SSH密钥生成与使用】
  4. 数据库面试题及优化手段
  5. 【SVP补帧】【教程】尽量不改变电脑设置的压制方案
  6. Ubuntu NumPy 安装
  7. 文献笔记(9)(2019ISSCC)
  8. matlab绘制均匀b样条曲线_[转载]用matlab实现B样条曲线
  9. (附源码)php初中历史专题教学网站 毕业设计 100623
  10. 【ManageEngine】OpManager 2022用户体验报告