Http分段下载实现
前言
最近要在安卓里面下载大文件,考虑到现场网络和使用的情况,如果简单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分段下载实现相关推荐
- EtherCAT SDO分段下载/上传说明
ETherCAT COE (CANOpen)的 SDO 属于应用层通讯协议,基于同步管理器(SM)的邮箱实现的,主站可以通过SDO实现一下功能. 对应邮箱消息数据格式如下 其中分段下载和分段上传请 ...
- python实现多线程下载_多线程分段下载研究的python实现(一)
我一直对下载文件比较感兴趣.现在我下载文件大部分是用迅雷,但迅雷也有一些不如意的地方,内存占用大,一些不必要的功能太多,不可定制.尤其是最后一点.现在有些下载对useragent,cookie,aut ...
- 聊聊视频分段下载的思路
很多优酷网的视频,都是被分拆成多段的.最近做项目,需要在线播放分段和下载视频.播放分段视频,其实就是常说的m3u的概念,把各个分段的地址做成一个播放列表,播放器把所有分段当作一个完整的视频.在播放过程 ...
- 例程五、HTTP Range使用 分段下载 与 下载后c语言合成例程 以照片为例
1. HTTP分段下载 可靠reference: https://www.bbsmax.com/A/gVdnERW15W/ https://developer.mozilla.org/zh-CN/do ...
- php 分段下载文件,php如何实现自动分段下载文件(代码示例)
本篇文章给大家带来的内容是关于php如何实现自动分段下载文件(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.function download($file_dir,$fi ...
- Java后端接口返回视频流,使用video组件播放视频,实现分段下载
视频文件保存在不为人知的地方,总之前端不能直接访问的位置,需要通过后端接口取出来再返回给前端. 前端这样子播放 <video controls="controls" cont ...
- AmazonS3 、大文件、分段上传、分段下载,上传下载超时,java.net.SocketTimeoutException问题
关于分段下载 客户端请求时:在请求头上增加range属性:bytes=fromByte-toByte. 如 值为bytes=100-200 服务端响应时:指定响应status=206,Content- ...
- golang协程分段下载文件
目录 golang协程 加锁示例 golang协程分段下载文件 golang协程 golang协程分段下载文件,为了提升性能,更好的利用golang协程的特性,我们开始使用他测试一下我们的程序 gol ...
- github分段下载
git由于找不到断点续传功能,而网络又经常很差,所以要想办法一点点下载下来,看到别人给的一些建议,整理一下 先手动创建工程 我这里是下载工程https://github.com/apache/incu ...
- vue-video-player,springboot实现视频分段下载播放
事情的起因是在博主把项目部署到服务器上后,发现由于视频太大,加上服务器太垃圾,导致稍微大点的视频加载很久才能播放(指十多分钟-),然后就上网查找资料,看下咋实现. 这里涉及到有关http请求的知识&q ...
最新文章
- php简单文章,php编写简单的文章发布程序
- 单数组去重(日常记录)
- 微软System Center 2012推进私有云计算
- 文本编辑器左边显示行数
- 为什么说dubbo的声明式缓存不好用!!!
- 在 xml 视图里指定 SAP UI5 VizType 实例
- echarts图表的内边距_echarts——各个配置项详细说明总结
- angular五大服务顺序,angularJS $事件处理程序的触发顺序
- Linux连接xshell时连不上的问题【转载】
- CVPR 2019 Oral | 华科开源效果超群的人体姿态迁移算法
- 20145234黄斐《java程序设计》第十三周代码检查
- 【XML】我所知道的XML
- 企业微信api消息接口调用
- 如何让微信好友永远拉黑不了你?
- Linux入门基础学习参考资料
- 【科普】码农是程序员吗?码农与真正程序员的区别是啥?
- MySQL删除表的三种方式
- Shiro 通过配置Cookie 解决多个二级域名的单点登录问题。
- GraphQL实战-第一篇-GraphQL介绍
- axure低保真原型_如何在Google表格中创建低保真原型