多线程下载

多线程下载:
1.发送请求,获取下载文件的长度
2.通过RandomAccessFile file=new RandomAccessFile(file,"rwd")对象,创建一个于要下载文件同样大小的文件
3.定义一个线程的数据,计算每条线程的下载量,long block=filesize%threadsize==0?filesize/threadsize:filesize/threadsize+1
4.定义一个内部类实现thread,作为下载的实现,把线程的id,和每条线程要下载的数量传递给这个类
5.计算要下载的开始位置,和结束位置,start=id*block; end=(id+1)*block-1;
6.设置分段请求,HttpGet get.setHread("Range","bytes="+start+"-"+end);
7.分段请求的数据返回的状态码是206,之后获取通过RandomAccessFile对象的一个seek(start);方法,获取内容进行写入即可

public void download(View v) { new Thread(new Runnable() { public void run() { try { HttpClient client = new DefaultHttpClient(); HttpGet head = new HttpGet("http://10.0.2.2:8080/FoodService/a.mp4"); HttpResponse rsponse = client.execute(head); if (rsponse.getStatusLine().getStatusCode() == 200) { long length = rsponse.getEntity().getContentLength(); RandomAccessFile accessFile = new RandomAccessFile(new File(Environment.getExternalStorageDirectory(), "b.mp4"),"rwd"); accessFile.setLength(length); int size = 3; //根据线程的数量计算一个文件分为多少块 long block = length % size == 0 ? length / size: length / size + 1; for (int i = 0; i < size; i++) { new downLoadImage(i, block).start(); } } } catch (Exception e) { e.printStackTrace(); } } }).start(); private class downLoadImage extends Thread { int threadid;//线程id long block;//下载的量 long start;//开始下载位置 long end;//结束的下载位置 public downLoadImage(int i, long block) { this.threadid = i; this.block = block; //计算每个线程的下载量 start=threadid*block; end=(threadid+1)*block-1; } public void run() { try { RandomAccessFile accessFile = new RandomAccessFile(new File(Environment.getExternalStorageDirectory(), "b.mp4"), "rwd"); accessFile.seek(start); HttpClient client=new DefaultHttpClient(); HttpGet request=new HttpGet("http://10.0.2.2:8080/FoodService/a.mp4"); request.setHeader("Range","bytes="+start+"-"+end); HttpResponse response = client.execute(request); if(response.getStatusLine().getStatusCode()==206){ InputStream inputStream = response.getEntity().getContent(); int len=0; byte[] buffer=new byte[1024]; while((len=inputStream.read(buffer))!=-1){ accessFile.write(buffer, 0, len); } inputStream.close(); Log.i("MainActivity", threadid+"线程"); } } catch (Exception e) { e.printStackTrace(); } } }
原文地址:https://www.cnblogs.com/tianshidechibang234/p/3887000.html