Android 文件断点续传

来源:互联网 发布:linux启动登录oracle 编辑:程序博客网 时间:2024/06/03 21:44

原创文章,如有转载,请注明出处: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); }

以上只是对断点续传的原理的简单分析

0 0
原创粉丝点击