Java多线程下载源码


Java多线程下载源码,仅作参考之用
  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.RandomAccessFile;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.URL;  
  8.   
  9. public class MyThreadDownloader  
  10. {  
  11.     public static void main(String args[])  
  12.     {  
  13.         // 下载连接   
  14.         String downloadURL = "http://localhost:8080/cangjingkong.avi";  
  15.         // 下载开启线程数   
  16.         int threadSize = 3;  
  17.         try  
  18.         {  
  19.             new MyThreadDownloader().download(downloadURL, threadSize);  
  20.         }  
  21.         catch (Exception e)  
  22.         {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.   
  27.     private void download(String downloadURL, int threadSize) throws Exception  
  28.     {  
  29.         String fileName = getFileName(downloadURL);  
  30.   
  31.         URL url = new URL(downloadURL);  
  32.   
  33.         HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  34.         // 设置超时   
  35.         connection.setConnectTimeout(5000);  
  36.         // 设置请求方式   
  37.         connection.setRequestMethod("GET");  
  38.         // 获取文件长度   
  39.         int fileLength = connection.getContentLength();  
  40.         // 保存文件   
  41.         File localFile = new File(fileName);  
  42.         // 临时文件不存内存,直接进行数据读写"rwd"   
  43.         RandomAccessFile randomAccessFile = new RandomAccessFile(localFile,"rwd");  
  44.         // 直接创建与服务器获取长度相等的文件   
  45.         randomAccessFile.setLength(fileLength);  
  46.         // 文件操作over,关闭   
  47.         randomAccessFile.close();  
  48.   
  49.         // 计算每条线程负责下载的数据量   
  50.         int downblock = fileLength % threadSize == 0 ? fileLength / threadSize  
  51.                 : fileLength / threadSize + 1;  
  52.         // 分配每条线程下载任务   
  53.         for (int threadID = 0; threadID < threadSize; threadID++)  
  54.         {  
  55.             //开启多线程下载任务   
  56.             new DownloadThread(threadID, url, localFile, downblock).start();  
  57.         }  
  58.     }  
  59.   
  60.   
  61.     /** 
  62.      * @param downloadURL 
  63.      *            下载连接 
  64.      * @return 返回下载文件名 
  65.      */  
  66.     private String getFileName(String downloadURL)  
  67.     {  
  68.         return downloadURL.substring(downloadURL.lastIndexOf("/") + 1);  
  69.     }  
  70.   
  71.     public final class DownloadThread extends Thread  
  72.     {  
  73.         private int threadID;      // 当前下载线程ID   
  74.         private URL url;           // 下载连接   
  75.         private File localFile;    // 目标文件   
  76.         private int downblock;     // 分段下载长度   
  77.         private int startPosition; // 开始下载位置   
  78.         private int endPosition;   // 结束下载位置   
  79.   
  80.         public DownloadThread(int threadID, URL url, File localFile,  
  81.                 int downblock)  
  82.         {  
  83.             this.threadID = threadID;  
  84.             this.url = url;  
  85.             this.localFile = localFile;  
  86.             this.downblock = downblock;  
  87.         }  
  88.   
  89.         public void run()  
  90.         {  
  91.             startPosition = threadID * downblock;  
  92.             endPosition = (threadID + 1) * downblock;  
  93.             try  
  94.             {  
  95.                 RandomAccessFile randomAccessFile = new RandomAccessFile(localFile,"rwd");  
  96.                 randomAccessFile.seek(startPosition);  
  97.                   
  98.                 HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  99.                 connection.setReadTimeout(5000);  
  100.                 connection.setRequestMethod("GET");  
  101.                 connection.setRequestProperty("Range""bytes="+startPosition+"-"+endPosition);  
  102.                   
  103.                 InputStream inputStream = connection.getInputStream();  
  104.                 byte[] buffer = new byte[1024];  
  105.                 int len = 0;  
  106.                 while ((len = inputStream.read(buffer)) != -1)  
  107.                 {  
  108.                     randomAccessFile.write(buffer, 0, len);  
  109.                 }  
  110.                   
  111.                 inputStream.close();  
  112.                 randomAccessFile.close();  
  113.                   
  114.                 System.out.println("第"+(threadID+1)+"条线程已经下载完成");  
  115.                   
  116.             }  
  117.             catch (FileNotFoundException e)  
  118.             {  
  119.                 e.printStackTrace();  
  120.             }  
  121.             catch (IOException e)  
  122.             {  
  123.                 e.printStackTrace();  
  124.             }  
  125.         }  
  126.     }  
  127. }  
未做任何处理

相关内容