java 断点续传 暂停_Java实现的断点续传功能

(IOException e) {

e.printStackTrace();

} finally {

try {

if (rantmpfile != null) {

rantmpfile.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

/*

* 实现下载功能的内部类,通过读取断点来设置向服务器请求的数据区间。

*/

class DownLoadThread implements Runnable {

private long startPos;

private long endPos;

private MultiTheradDownLoad task = null;

private RandomAccessFile downloadfile = null;

private int id;

private File tmpfile = null;

private RandomAccessFile rantmpfile = null;

private CountDownLatch latch = null;

public DownLoadThread(long startPos, long endPos,

MultiTheradDownLoad task, int id, File tmpfile,

CountDownLatch latch) {

this.startPos = startPos;

this.endPos = endPos;

this.task = task;

this.tmpfile = tmpfile;

try {

this.downloadfile = new RandomAccessFile(this.task.filename,

"rw");

this.rantmpfile = new RandomAccessFile(this.tmpfile, "rw");

} catch (FileNotFoundException e) {

e.printStackTrace();

}

this.id = id;

this.latch = latch;

}

@Override

public void run() {

HttpURLConnection httpcon = null;

InputStream is = null;

int length = 0;

System.out.println("the thread " + id + " has started!!");

while (true) {

try {

httpcon = (HttpURLConnection) task.url.openConnection();

setHeader(httpcon);

//防止网络阻塞,设置指定的超时时间;单位都是ms。超过指定时间,就会抛出异常

httpcon.setReadTimeout(20000);//读取数据的超时设置

httpcon.setConnectTimeout(20000);//连接的超时设置

if (startPos < endPos) {

//向服务器请求指定区间段的数据,这是实现断点续传的根本。

httpcon.setRequestProperty("Range", "bytes=" + startPos

+ "-" + endPos);

System.out

.println("Thread " + id

+ " the total size:---- "

+ (endPos - startPos));

downloadfile.seek(startPos);

if (httpcon.getResponseCode() != HttpURLConnection.HTTP_OK

&& httpcon.getResponseCode() != HttpURLConnection.HTTP_PARTIAL) {

this.task.bool = true;

httpcon.disconnect();

downloadfile.close();

System.out.println("the thread ---" + id

+ " has done!!");

latch.countDown();//计数器自减

break;

}

is = httpcon.getInputStream();//获取服务器返回的资源流

long count = 0l;

byte[] buf = new byte[1024];

while (!this.task.bool && (length = is.read(buf)) != -1) {

count += length;

downloadfile.write(buf, 0, length);

//不断更新每个线程下载资源的起始位置,并写入临时文件;为断点续传做准备

startPos += length;

rantmpfile.seek(8 * id + 8);

rantmpfile.writeLong(startPos);

}

System.out.println("the thread " + id

+ " total load count: " + count);

//关闭流

is.close();

httpcon.disconnect();

downloadfile.close();

rantmpfile.close();

}

latch.countDown();//计数器自减

System.out.println("the thread " + id + " has done!!");

break;

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (is != null) {

is.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

/*

* 为一个HttpURLConnection模拟请求头,伪装成一个浏览器发出的请求

*/

private void setHeader(HttpURLConnection con) {

con.setRequestProperty(

"User-Agent",

"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3");

con.setRequestProperty("Accept-Language", "en-us,en;q=0.7,zh-cn;q=0.3");

con.setRequestProperty("Accept-Encoding", "aa");

con.setRequestProperty("Accept-Charset",

"ISO-8859-1,utf-8;q=0.7,*;q=0.7");

con.setRequestProperty("Keep-Alive", "300");

con.setRequestProperty("Connection", "keep-alive");

con.setRequestProperty("If-Modified-Since",

"Fri, 02 Jan 2009 17:00:05 GMT");

con.setRequestProperty("If-None-Match", "\"1261d8-4290-df64d224\"");

con.setRequestProperty("Cache-Control", "max-age=0");

con.setRequestProperty("Referer",

"http://www.skycn.com/soft/14857.html");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值