当前位置:  编程技术>java/j2ee

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

    来源: 互联网  发布时间:2014-11-02

    本文导语:  代码如下: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.ClientProtocolExce...

代码如下:

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.:81/200812/tools/HA_LeapFTP.rar"))
    .start();

  new Thread(
    new D(
      "http://al.: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();
  }
 }
}


    
 
 

您可能感兴趣的文章:

  • gdb是什么命令跳到下一个断点
  • sz命令如何断点续传(Ubuntu->Windows)
  • 请教:AIX命令中的procstack的命令显示的tid是线程ID吗
  • 查看单个线程状态的命令
  • linux的mv命令是线程安全的吗?
  • 在linux下查看一个进程它有多少个线程是用什么命令?
  • processlist命令 查看mysql 线程
  • 请问:编译线程程序时,命令数是写成 -lpthread 还是写成-l pthread啊,怎么两种方式都可以啊,谁是标准的呢?
  • SuSE9上,多线程程序正在运行,用pstack打印堆栈信息,结果导致进程挂起(ps x 命令显示为T状态),为什么
  • 请问:在socket编程的服务器端,想采用多线程来处理客户端的命令,应该怎样写啊?
  • ps -ef|grep server1 用此命令查找线程server1,如何判断返回的是0还是多少条记录?(模糊查询)
  • 请教高手:ps命令中如何区分内核守护线程和用户进程?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 命令行不支持中文的问题
  • 为何技术支持需要熟悉unix命令?
  • 怎样知道linux下是否支持某个系统命令?
  • 请问gprof命令对于多进程服务器的性能测试是否支持?
  • 怎样让DOS支持长文件名,且能用COPY等原命令对长文件名操作?
  • iis支持asp.net4.0的注册命令使用方法
  • solaris怎么支持命令补全?google了好几天也没结果
  • 在运行程序时报命令不支持,请求高手帮助(MAC)
  • 如果linux不支持ping命令,会有什末样的结果呢?望高手指点
  • windows下cmd命令行显示UTF8字符设置(CHCP命令)
  • linux在脚本执行命令和直接在命令行执行命令有什么区别
  • c/c++预处理命令预#error介绍
  • 请教:使用system(命令)或者exec(命令)启动一个进程执行命令,如何判断这个命令是否启动成功或正在运行?
  • linux下nm命令(显示可执行文件的符号信息)介绍以及常见nm命令用法举例
  • linux 的命令操作和 windows的命令提示行有什么不同呢?? 为什么windows一般都不用命令提示行操作呢??
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 使用ps命令,如何使用系统命令根据进程名称获取进程和子进程的ID?除了ps,还有其它系统命令的办法吗?谢谢。
  • c/c++预处理命令预#undef介绍
  • 如何运行外部命令后不等外部命令运行结束直接运行下一条命令
  • c/c++预处理命令预#pragma介绍
  • 请问:早redhat 7.3的字符模式下:改(设)IP 命令是:ifconfig eth0 192.168.0.xx ,那么改(设)掩码命令是什么呢? 还有改(设)网关地址命令是什
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 请教unix常用命令命令问题
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • linux下执行命令为什么要在命令前加./
  • c/c++预处理命令预#line介绍
  • 查询ls命令的命令文件属于系统中的哪个软件包?(在线等)
  • c/c++预处理命令预#include介绍
  • linux命令行下使用curl命令查看自己机器的外网ip
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • linux中有没有什么命令能列出所有linux的内部命令


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3