这里使用的服务器是Appach服务器。支持HTTP协议,同时,HTTP协议支持下载,所以在HTTP的基础上实现多线程下载,非常的简单。通过HTTP的特定命令,可以获取目标文件的大小,还可以设定开始下载的位置。代码如下:非常简单,不做多解释。
public void downLoader() throws Exception{
URL url = new URL(this.path);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); //简历一个http连接
httpURLConnection.setRequestMethod("GET"); //设置请求头
httpURLConnection.setReadTimeout(5*1000); //设置连接超时时间
/*获取文件大小*/
this.fileLength = httpURLConnection.getContentLength();
/*获取文件名称*/
this.fileName = this.getFileName(path); //就是获取path最后的一段作为名字
saveFileGlobal = new File(fileName);
System.out.println("saveFileGlobal="+saveFileGlobal);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFileGlobal, "rwd"); //创建一个RandomAccessFile进行保存,因为RandomAccessFile有一个特点就是可以被多个线程打开,同时可以移动写入点的位置。
randomAccessFile.setLength(fileLength);
randomAccessFile.close();
/*开始创建线程进行下载*/
for(int threadId=0;threadId<threadSize;threadId++){
new DownLoaderThread(threadId, url, saveFileGlobal, fileLength*threadId/threadSize,
fileLength*(threadId+1)/threadSize-1).start();
}
}
上面代码的主要工作,只是完成了对服务器文件的属性的获取,包括文件名,文件大小。已经开启多个线程进行下载。建议线程数在10左右,不要太多。下面则是每个线程具体的工作,完成自己需要下载的内容,然后写入同一个文件
public class DownLoaderThread extends Thread{
.........................................
@Override
public void run(){
try {
HttpURLConnection conn = (HttpURLConnection) this.url.openConnection();
conn.setRequestMethod("GET"); //设置请求头
conn.setReadTimeout(5*1000); //设置超时时间
conn.setRequestProperty("Range", "bytes="+startPostion+"-"+endPostion); /<span style="color:#FF0000;">/这句话很重要,告诉服务器,我们需要需要服务器返回请求文件的哪一段数据</span>
RandomAccessFile randomFile = new RandomAccessFile(saveFile, "rwd"); //创建文件
randomFile.seek(startPostion); //移动文件写入地址
InputStream inStream = conn.getInputStream(); //写入
byte[] buffer = new byte[1024*1024];
int length;
while((length = inStream.read(buffer)) != -1){
randomFile.write(buffer, 0, length);
}
inStream.close();
randomFile.close();
Log.v("Debug", "线程"+threadId+"完成下载");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
HTTP多线程下载,就这么简单,建议在WIFI下进行。主要是HTTP协议已经对下载有很好的支持。