歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java多線程下載輔助類實現

使用聲明:

類名:MultiThreadDownloadUtil

API:

(1)download(String path,int count);

path:文件URL;

count:線程數量;

  1. package org.xiazdong.multidownload.util;  
  2.   
  3. import java.io.File;  
  4. import java.io.InputStream;  
  5. import java.io.RandomAccessFile;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.URL;  
  8.   
  9.   
  10. public class MultiThreadDownloadUtil{  
  11.     private static int filesize;  
  12.     private static int block;  
  13.     private static String filename;  
  14.     private static int downloadsize;  
  15.     private class MyThread extends Thread{  
  16.         private int i;          //線程ID   
  17.         private String path;    //下載文件的URL   
  18.   
  19.         public MyThread(int i, String path) {  
  20.             this.i = i;  
  21.             this.path = path;  
  22.             downloadsize = 0;  
  23.         }  
  24.         @Override  
  25.         public void run() {  
  26.             try{  
  27.                 System.out.println("線程"+(i+1)+"開始下載");  
  28.                 //1.打開文件,並定位位置   
  29.                 RandomAccessFile raf = new RandomAccessFile(new File(filename), "rwd");  
  30.                 raf.seek(i*block);          //定位到此線程要負責下載的位置   
  31.                 int start = i*block;  
  32.                 int end = (i+1)*block-1;  
  33.                 //2.連接服務器   
  34.                 URL url = new URL(path);  
  35.                 HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  36.                 conn.setRequestMethod("GET");  
  37.                 conn.setRequestProperty("range""bytes="+start+"-"+end);   //發出請求頭   
  38.                   
  39.                 if(conn.getResponseCode()==206){        //注意:分段下載的返回碼為206,而不是200   
  40.                     InputStream in = conn.getInputStream();  
  41.                     int length = 0;  
  42.                     byte[]data = new byte[1024];  
  43.                     while((length=in.read(data))!=-1){  
  44.                         raf.write(data,0,length);       //寫入本地文件   
  45.                     }  
  46.                 }  
  47.                 //顯示下載進度   
  48.                 downloadsize += (end-start);  
  49.                 System.out.println("已下載"+downloadsize/1024.0+"k,共"+filesize/1024.0+"k");  
  50.                 //3.關閉文件   
  51.                 raf.close();  
  52.                 System.out.println("線程"+(i+1)+"結束下載...");  
  53.             }  
  54.             catch(Exception e){  
  55.                 e.printStackTrace();  
  56.             }  
  57.         }  
  58.     }  
  59.     /** 
  60.      * 下載文件 
  61.      * @param path          URL 
  62.      * @param threadcount   線程數 
  63.      * @throws Exception 
  64.      */  
  65.     public static void download(String path,int threadcount) throws Exception{  
  66.         filename = path.substring(path.lastIndexOf('/')+1);  
  67.         filesize = getFileSize(path);  
  68.         block = getBlockSize(filesize,threadcount);  
  69.         createLocalRandomFile(filesize);  
  70.         MultiThreadDownloadUtil mdu = new MultiThreadDownloadUtil();  
  71.         for(int i=0;i<threadcount;i++){  
  72.             mdu.new MyThread(i,path).start();  
  73.         }  
  74.     }  
  75.     /** 
  76.      * 創建一個本地文件,並設置文件的大小 
  77.      * @param filesize 
  78.      * @throws Exception 
  79.      */  
  80.     private static void createLocalRandomFile(int filesize) throws Exception {  
  81.         RandomAccessFile raf = new RandomAccessFile(new File(filename), "rwd");  
  82.         raf.setLength(filesize);  
  83.         raf.close();  
  84.     }  
  85.     /** 
  86.      * 根據文件總大小和線程數求出每個線程要下載的數據量 
  87.      * @param filesize 
  88.      * @param threadcount 
  89.      * @return 
  90.      */  
  91.     private static int getBlockSize(int filesize, int threadcount) {  
  92.         return filesize%threadcount==0?filesize/threadcount:(filesize/threadcount+1);  
  93.     }  
  94.     /** 
  95.      * 求出文件總大小 
  96.      * @param path 
  97.      * @return 
  98.      * @throws Exception 
  99.      */  
  100.     private static int getFileSize(String path) throws Exception{  
  101.         URL url = new URL(path);  
  102.         HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  103.         conn.setRequestMethod("GET");  
  104.         if(conn.getResponseCode()==200){  
  105.             return conn.getContentLength();  
  106.         }  
  107.         else{  
  108.             return 0;  
  109.         }  
  110.     }  
  111. }  

測試類:

  1. package org.xiazdong.download;  
  2.   
  3. import org.xiazdong.multidownload.util.MultiThreadDownloadUtil;  
  4.   
  5.   
  6. public class MultiThreadDownloader {  
  7.   
  8.     public static void main(String[] args) throws Exception {  
  9.         int threadCount = 3;    //指定線程數量   
  10.         String path = "http://dlc2.pconline.com.cn/filedown_61761_6694063/drivethelife2010_pconline_setup.exe"; //指定下載文件路徑  
  11.         MultiThreadDownloadUtil.download(path, threadCount);  
  12.     }  
  13. }  

將此文件下載到工程目錄後,運行可用;

Copyright © Linux教程網 All Rights Reserved