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

时间:2021-05-19

复制代码 代码如下:
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();
}
}
}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章