Http多线程下载文件

  1 package unit;
  2 
  3 import java.io.ByteArrayOutputStream;
  4 import java.io.File;
  5 import java.io.FileOutputStream;
  6 import java.io.InputStream;
  7 import java.math.BigDecimal;
  8 import java.net.URL;
  9 import java.net.URLConnection;
 10 import java.util.ArrayList;
 11 import java.util.Collections;
 12 import java.util.concurrent.ExecutorService;
 13 import java.util.concurrent.Executors;
 14   
 15 /**
 16  * 文件下载
 17  */
 18 public class HttpUtils {  
 19     static long sumContent = 0;
 20     static float useTime = 0;
 21     ArrayList<Float> speed = new ArrayList<Float>();
 22     public static void main(String[] args) {
 23         String url ="http://xcy1.xiaoshikd.com/python3.zip\r\n";
 24         String dirPath = "D:/111/downLoad/";
 25         String dirPath2 = "D:/222/downLoad/";
 26         String dirPath3 = "D:/333/downLoad/";
 27         HttpUtils.download(url, dirPath, "============");
 28         HttpUtils.download(url, dirPath2, "============================");
 29         HttpUtils.download(url, dirPath3, "==============================================");
 30     }
 31     
 32     public static void download(String url, String filePath, final String message) {
 33          HttpUtils.getInstance().download(url, filePath, new HttpClientDownLoadProgress() {  
 34                 @Override  
 35                 public void onProgress(int progress) {  
 36                     System.out.println("download progress "+message+ progress+"%");  
 37                 }  
 38             });
 39     }
 40   
 41     /** 
 42      * 最大线程池 
 43      */  
 44     public static final int THREAD_POOL_SIZE = 4;  
 45   
 46     public interface HttpClientDownLoadProgress {  
 47         public void onProgress(int progress);  
 48     }  
 49   
 50     private static HttpUtils httpClientDownload;  
 51   
 52     private ExecutorService downloadExcutorService;  
 53   
 54     private HttpUtils() {  
 55         downloadExcutorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);  
 56     }  
 57   
 58     public static HttpUtils getInstance() {  
 59         if (httpClientDownload == null) {  
 60             httpClientDownload = new HttpUtils();  
 61         }  
 62         return httpClientDownload;  
 63     }  
 64   
 65     /** 
 66      * 下载文件 
 67      *  
 68      * @param url 
 69      * @param filePath 
 70      * @param progress 
 71      *            进度回调 
 72      */  
 73     public void download(final String url, final String filePath, final HttpClientDownLoadProgress progress) {  
 74         downloadExcutorService.execute(new Runnable() {  
 75             @Override  
 76             public void run() {  
 77                 httpDownloadFile(url, filePath, progress);  
 78             }  
 79         });  
 80     }  
 81   
 82     /** 
 83      * 下载文件 
 84      * @param url 
 85      * @param filePath 
 86      */  
 87     private void httpDownloadFile(String strUrl, String filePath, HttpClientDownLoadProgress progress) {  
 88         try {  
 89             long startTime = System.currentTimeMillis();
 90             URL url = new URL(strUrl);
 91             String file = url.getFile();
 92             String fileName = file.substring(file.lastIndexOf('/')+1);
 93             URLConnection conn = url.openConnection();
 94             InputStream is = conn.getInputStream();
 95             long contentLength = conn.getContentLength();  
 96             ByteArrayOutputStream output = new ByteArrayOutputStream();  
 97             byte[] buffer = new byte[65536];  
 98             int r = 0;  
 99             long totalRead = 0;  
100             while ((r = is.read(buffer)) > 0) {  
101                 output.write(buffer, 0, r);  
102                 totalRead += r;  
103                 sumContent+=r;
104                 if (progress != null) {// 回调进度  
105                     progress.onProgress((int) (totalRead * 100 / contentLength));  
106                 }  
107             }  
108             
109             /**
110              * 将下载文件写入本地
111              */
112             File f = new File(filePath);
113             if(!f.exists()) {
114                 f.mkdirs();
115             }
116             filePath = filePath+fileName;
117             FileOutputStream fos = new FileOutputStream(filePath);
118             output.writeTo(fos);  
119             output.flush(); 
120             
121             Long endTime = System.currentTimeMillis();
122             useTime = (float)(endTime-startTime)/1000;
123             getDoloadResult(sumContent, useTime);
124            
125             output.close();  
126             fos.close(); 
127             is.close();
128             downloadExcutorService.shutdown();
129         } catch (Exception e) {  
130             e.printStackTrace();  
131             downloadExcutorService.shutdown();
132         }
133     }  
134     
135     public void getDoloadResult(long contentLength, float useTime) {
136          System.out.println("sumContentLength: "+contentLength);
137          System.out.println("useTime: "+useTime);
138          
139          float bySpead = contentLength/useTime/1024/1024;
140          BigDecimal b = new BigDecimal(bySpead);
141          bySpead = b.setScale(2, 4).floatValue();;
142          speed.add(bySpead);
143          System.out.println("avgSpeed: "+bySpead+" M/s");
144          System.out.println("maxSpeed: "+Collections.max(speed)+" M/s");
145     }
146 }  

 

posted @ 2017-12-13 17:05  林**  阅读(1517)  评论(0编辑  收藏  举报