Android 文件断点续传

原创文章,如有转载,请注明出处:http://blog.csdn.net/myth13141314/article/details/69364126

主要有几个关键点
  • 一个是文件下载暂停以后保存状态,包括文件总的大小,下载到哪里了
  • 一个是重新下载的时候怎么继续下载,就是要设置网络请求,让服务器返回剩下的文件
  • 再一个就是怎么把新下载的文件,接着上次下载暂停的位置继续保存
下面分别分析下思路,先贴段简单的下载代码
public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            HttpURLConnection connection = null;
            try {
                URL url = new URL(address);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(8000);
                connection.setReadTimeout(8000);
                InputStream in = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder response =new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }

                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }).start();
}

下载暂停时,保存文件状态,一般保存到数据库
  • 主要是保存文件大小
long filelength = connection.getContentLength();

怎么让服务器接着下载呢
  • 主要用到的是HttpURLConnection 的setRequestProperty()方法
connection.setRequestProperty("Range", "bytes=" + lastPostion + "-" + endposition);
  • 通过设置“Range”属性,可以让服务器从文件的特定位置开始返回数据,返回的位置即为”bytes=”的值,上面就是从lastPostion 开始返回,到endposition结束
  • 设置了“Range”属性以后,请求成功的返回码变为206,即connection.getResponseCode()=206,而不再是200

从服务器获取了剩余的文件以后怎么写入已经下载的文件呢?即从暂停的地方开始写入
  • 主要用到的是 IO 包中的 RandAccessFile 类
  • RandAccessFile 类有个setLength()方法,可以直接设置RandomAccessFile文件的长度。还有个seek()方法,可以直接设定从文件的哪个位置开始写入文件。
RandomAccess accessFile = new RandomAccessFile("down.zip","rw"); 
// 定位文件指针到 lastPostion 位置 
accessFile .seek(lastPostion ); 
byte[] b = new byte[1024]; 
int nRead; 
// 从输入流中读入字节流,然后写到文件中 
while((nRead=input.read(b,0,1024)) > 0) { 
    accessFile .write(b,0,nRead); 
}

以上只是对断点续传的原理的简单分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值