源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

命令行使用支持断点续传的java多线程下载器

  • 时间:2020-03-25 12:46 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:命令行使用支持断点续传的java多线程下载器
[u]复制代码[/u] 代码如下:
package org.load.download; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.text.DecimalFormat; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; public class Download {  public static void main(String[] args) {   new Thread(new D("http://al.jb51.net:81/200812/tools/HA_LeapFTP.rar"))     .start();   new Thread(     new D(       "http://al.jb51.net:81/200812/tools/HA_LeapFTP.rar"))     .start();  } } class D implements Runnable {  private static final String PATH = "E:\\download";  private String url;  private String fileName = null;  static {   if (!new File(PATH).exists()) {    new File(PATH).mkdirs();   }  }  public D(String url) {   this.url = url;   this.fileName = this.url.substring(this.url.lastIndexOf('/') + 1,     this.url.length()); // 得到文件名  }  public void download() throws ClientProtocolException, IOException {   final RandomAccessFile file = new RandomAccessFile(this.PATH + File.separator     + this.fileName, "rw");   HttpClient client = new DefaultHttpClient();   HttpGet get = new HttpGet(this.url); //  client.getParams().setParameter("http.socket.timeout", 5000); // 设置连接超时   long localFileSize = this.getLocalFileSize();   final long remoteFileSize = this.getRemoteFileSize();   // 如果本地文件未下载完成,则断点下载   if (-1 != localFileSize && -1 != remoteFileSize     && localFileSize < remoteFileSize) {    file.seek(localFileSize); // 本地标记    get.addHeader("Range", "bytes=" + localFileSize + "-"      + remoteFileSize); // 远程标记   }   // 如果本地文件大小大于等于远程文件,则已经下载完成   if (-1 != localFileSize && localFileSize >= remoteFileSize) {    return;   }   // 开始下载   HttpResponse response = client.execute(get);   if (300 >= response.getStatusLine().getStatusCode()) {    HttpEntity en = response.getEntity();    InputStream in = en.getContent();    byte[] by = new byte[512];    int len = -1;    // 显示进度    new Thread(new Runnable(){     @Override     public void run() {      try {       while (file.length() < remoteFileSize) { //       Runtime.getRuntime().exec("cmd cls");  // 听说会另起个进程        System.out.println(fileName          + "已下载:\t"          + new DecimalFormat("0.00%").format(file            .length() / (double) remoteFileSize));        Thread.sleep(5000);       }      } catch (IOException e) {       e.printStackTrace();      } catch (InterruptedException e) {       e.printStackTrace();      }     }    }).start();    // 开始下载    while (-1 != (len = in.read(by))) {     file.write(by, 0, len);    }    in.close();    client.getConnectionManager().shutdown();   }  }  // 得到本地文件大小  private long getLocalFileSize() {   File file = new File(PATH + File.separator + this.fileName);   if (!file.exists()) {    return -1l;   }   return file.length();  }  // 得到远程文件大小  private long getRemoteFileSize() throws ClientProtocolException,    IOException {   HttpClient client = new DefaultHttpClient();   HttpGet get = new HttpGet(this.url);   client.getParams().setParameter("http.socket.timeout", 5000);   HttpResponse response = client.execute(get);   if (200 == response.getStatusLine().getStatusCode()     || 300 >= response.getStatusLine().getStatusCode()) {    HttpEntity en = response.getEntity();    return en.getContentLength();   }   return -1l;  }  @Override  public void run() {   try {    download();    System.out.println(this.fileName + "\t下载完成");   } catch (ClientProtocolException e) {    e.printStackTrace();   } catch (IOException e) {    e.printStackTrace();   }  } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部