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