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

关键点

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值