实现断点续传

1.首先获取网络文件的长度length,然后在Android客户端中生成一个与网络文件长度相等的本地文件。
2.开启n条线程下载文件,计算每条线程负责下载的数据量,公式如下:


   
   
  1. int block = length % n == 0 ? length / n : length / n + 1;

3.开启多条线程分别从网络文件的不同位置下载数据,并从本地文件相同的位置写入数据,要计算出每条线程从网络文件的什么位置开始下载数据,到什么位置结束。这个可以通过设置http的相关属性来实现。
部分代码如下所示,上面有详细的注释:

//下载数据保存到本地的文件
File saveFile;
        
//下载数据所在的URL地址
URL url;
        
//下载数据的开始位置
int startPos;
        
//下载数据的结束位置
int endPos;
        
//开启http连接
HttpURLConnection http = (HttpURLConnection)url.openConnection();
        
//设置从startPos到endPos位置之间的数据
http.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
        
//设置http的其他属性
...
        
//获取http输入流
InputStream inStream = http.getInputStream();
        
//设置本地缓存的大小为1024
byte[] buffer = new byte[1024]; 
        
//打开本地下载文件
RandomAccessFile file = new RandomAccessFile(saveFile, "rwd");
        
//文件指针指向文件中开始放置下载的内容的地方
//因为可能之前已经下载过一部分内容了
file。seek(startPos);
        
//循环下载数据,每次下载1024byte的数据存入缓存buffer中,直至下载结束.
//offset是实际下载的字节数
//可以在这个while循环里面处理中断情况,需要记录//当前已经下载了多少数据,
//即累计的offset值
//然后下次下载重新计算startPos和endPos,重复调用这段代码即可
while (offset = inStream.read(buffer, 0, 1024) != -1) {
    //把下载的大小为offset的数据写入本地下载文件
    file.write(buffer, 0, offset);
}
        
//下载完毕,关闭输入流
file.close();

 http 连接相关的设置

connection.setRequestMethod("GET");
connection.setUseCaches(false);
connection.setReadTimeout(5 * 555);
connection.setRequestProperty("Range", "bytes=" + start + "-" + end);
connection.setRequestProperty(
                "Accept",
                "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, * /*");
connection.setRequestProperty("Accept-Language", "zh-CN");
connection.setRequestProperty("Referer", urlString);
connection.setRequestProperty("Charset", "UTF-8");
connection.setRequestProperty("Connection", "Keep-Alive");
建立连接之前注意一下 setRequestProperty("Range", "bytes=" + start + "-" + end);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值