这里使用的服务器是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协议已经对下载有很好的支持。