在一些App上我们经常会下载一些文件,而这些文件下载时如果出现故障了,这时就会有一个续传功能,在原有的文件下载上,接着下载文件,而不是将文件重新下载,这就是断点续传功能。
下面,我们就来讲一下断点续传的功能如何实现
首先,断点续传也是文件下载,但是我们需要获取当前下载文件的总长度
//在开始时,设立三个变量,分别时start,end,max
//第一次获取需要下载文件的总大小,并通过handler发送给Activity,更新UI
try {
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
max = connection.getContentLength();
Message obtain = Message.obtain();
obtain.what = FileNetModel.PROGRESSBAR_BREAKPOINTMAX;
obtain.obj = max;
handler.sendMessage(obtain);
} catch (Exception e) {
e.printStackTrace();
}
在第一次网络访问时,我们只获取他们的文件总长度
之后呢,我们做一个判断,判断是否文件下载过
File file = new File(path);
if (file.exists()){
start = (int) file.length();
}
end = max;
然后进行第二次网络访问
URL url1 = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
connection.setRequestProperty("Range","bytes="+start+"-"+end+"");//设置请求头,格式固定
之后使用随机访问流进行文件读取
if (connection.getResponseCode()==206){
InputStream inputStream = connection.getInputStream();
RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");//使用随机访问流
randomAccessFile.seek(start);
byte[] bytes = new byte[1024];
int len = 0;
int progress = start;
while ((len = inputStream.read(bytes))!=-1){
randomAccessFile.write(bytes,0,len);//随机访问六写入文件
}
如此,便可实现断点续传,就算在下载过程中有网络故障的问题,也不会让用户重新下载,极大的优化了用户体验。
感谢观看