手机
当前位置:查字典教程网 >编程开发 >Java >命令行使用支持断点续传的java多线程下载器
命令行使用支持断点续传的java多线程下载器
摘要:复制代码代码如下:packageorg.load.download;importjava.io.File;importjava.io.IOE...

复制代码 代码如下:

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();

}

}

}

【命令行使用支持断点续传的java多线程下载器】相关文章:

基于Java回顾之多线程详解

java switch语句使用注意的四大细节

Java多线程的用法详解

java基本教程之线程让步 java多线程教程

java多线程编程之为什么要进行数据同步

java多线程编程之慎重使用volatile关键字

怎么运行用记事本写的java程序

Java中 URL实现断点下载

java多线程编程之使用runnable接口创建线程

使用JAVA判断凸多边形的示例代码

精品推荐
分类导航