所用知识点:
1、设置http协议字段Range “bytes=“start+”-”+end
conn.addRequestProperty("Range", "bytes=" + start + "-" + end);
2、RandomAccessFile设置写入的位置
// 指定文件方式为可读写可操作
RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwd");
accessFile.seek(start);
3、开启多线程发送网络请求
// 启动下载
DownloadRunnable runnable = new DownloadRunnable(url,downLoadFile.getAbsolutePath(),start,end);
threadPool.execute(runnable);
DownLoad.java
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
*
*/
public class DownLoad {
// 创建线程池
private Executor threadPool= Executors.newFixedThreadPool(3);
private Handler handler;
public DownLoad(Handler handler)
{
this.handler = handler;
}
private class DownloadRunnable implements Runnable
{
private String url;
private String fileName;
private int start;
private int end;
public DownloadRunnable(String url,String fileName,int start,int end)
{
this.url = url;
this.fileName = fileName;
this.start = start;
this.end = end;
}
@Override
public void run() {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.addRequestProperty("Range", "bytes=" + start + "-" + end);
// 指定文件方式为可读写可操作
RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwd");
accessFile.seek(start);
InputStream in = conn.getInputStream();
// 设置缓冲区
byte b[] = new byte[4 + 1024];
int len =0;
while ((len = in.read(b))!=-1)
{
accessFile.write(b,0,len);
}
if (accessFile!=null)
{
accessFile.close();
}
if (in!=null)
{
in.close();
}
Message message = Message.obtain();
message.what = 1;
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void downLoadFile(String url)
{
try {
URL httpUrl = new URL(url);
try {
HttpURLConnection conn = (HttpURLConnection)httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
int length = conn.getContentLength();
int block = length/3;
int start;
int end;
String fileName = getFileName(url);
File parent = Environment.getExternalStorageDirectory();
File downLoadFile = new File(parent,fileName);
/**
* 假如总长度为11
* block = 11/3=3
* 第一个线程下载0-block=0-2
* 第二个线程下载3-2*block-1= 3-5
* 第三个线程下载6-length=6-11
* */
for (int i=0;i<3;i++)
{
start = i*block;
end = (i+1)*block -1;
if (i == 2)
{
end = length;
}
// 启动下载
DownloadRunnable runnable = new DownloadRunnable(url,downLoadFile.getAbsolutePath(),start,end);
threadPool.execute(runnable);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
private String getFileName(String url)
{
return url.substring(url.lastIndexOf("/"));
}
}
MainActiviy.java 关键代码
private int count=0;
handler = new android.os.Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
count +=msg.what;
// 说明三个线程都下载完成
if (count == 3)
{
textView.setText("Download Succ");
}
}
};
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
new DownLoad(handler).downLoadFile("http://192.168.0.103:8080/Pro_Test/aa.jpg");
}
}).start();
}
});