多线程下载 断点续传
来源:互联网 发布:十天学会单片机 编辑:程序博客网 时间:2024/05/29 18:38
package wml.dl;
import java.io.BufferedInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.Properties;
import wml.dl.io.BufferedRandomOutputStream;
* 下载线程,负责下载DLBlock
* @author wml
public class DLThread implements Runnable {
private static final int INPUT_BUFFER_SIZE = 1024;
private static final int OUTPUT_BUFFER_SIZE = 8192;
private DLTask task;
private DLBlock block;
private boolean isDone;
private boolean isStop;
public DLBlock getBlock() {
return block;
public DLThread(DLTask task, DLBlock block) {
this.task = task;
this.block = block;
@Override
public void run() {
block.setStatus(DLBlock.STATUS_RUNNING);
BufferedRandomOutputStream randomOutputStream = null;
try { http://www.huiyi8.com/gundongdaima/ 滚动代码
randomOutputStream = new BufferedRandomOutputStream(task.openRandomAccessFile(), OUTPUT_BUFFER_SIZE);
} catch (FileNotFoundException e) {
block.setThrowable(e);
e.printStackTrace();
isDone = true;
return;
HttpURLConnection conn = null;
long downloadPosition = 0;
try {
if(task.isSupportedContentRange()) {//断点续传
block.setDownloaded(Math.max(block.getDownloaded() - OUTPUT_BUFFER_SIZE, 0));// -8kb保证下载结果(有可能之前写入失败)
downloadPosition = block.getBegin() + block.getDownloaded();
randomOutputStream.seek(downloadPosition);
Properties reqProps = new Properties();
if(task.isSupportedContentRange()) {//设置下载范围
reqProps.setProperty("Range", "bytes=" + downloadPosition + "-" + block.getEnd());
conn = DLUtils.getChromeURLConnection(task.getUri(), false, reqProps);
InputStream in = new BufferedInputStream(DLUtils.getInputStream(conn.getInputStream(), conn.getContentEncoding()), INPUT_BUFFER_SIZE);
byte[] buf = new byte[INPUT_BUFFER_SIZE];
int len;
while((len = in.read(buf)) != -1) {
randomOutputStream.write(buf, 0, len);
block.updateDownloaded(len);
downloadPosition += len;
if(task.isSupportedContentRange() && downloadPosition >= block.getEnd()
|| isStop
|| !task.isRunning()) {
//也许将任务部分分配给了其他线程(增加了线程),在后面做详细处理
break;
} catch (IOException e) {
block.setThrowable(e);
e.printStackTrace();
} finally {
DLUtils.close(conn);
DLUtils.close(randomOutputStream);
isDone = true;
if(downloadPosition >= block.getEnd()) {
//块下载完成
block.setStatus(DLBlock.STATUS_DONE);
} else {
//停止下载
block.setStatus(DLBlock.STATUS_PAUSE);
try {//检查并设置任务状态
task.checkDone();
} catch (FileNotFoundException e) {
block.setThrowable(e);
e.printStackTrace();
public boolean isDone() {
return isDone;
}
public void stop() {
isStop = true;
}
import java.io.BufferedInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.Properties;
import wml.dl.io.BufferedRandomOutputStream;
* 下载线程,负责下载DLBlock
* @author wml
public class DLThread implements Runnable {
private static final int INPUT_BUFFER_SIZE = 1024;
private static final int OUTPUT_BUFFER_SIZE = 8192;
private DLTask task;
private DLBlock block;
private boolean isDone;
private boolean isStop;
public DLBlock getBlock() {
return block;
public DLThread(DLTask task, DLBlock block) {
this.task = task;
this.block = block;
@Override
public void run() {
block.setStatus(DLBlock.STATUS_RUNNING);
BufferedRandomOutputStream randomOutputStream = null;
try { http://www.huiyi8.com/gundongdaima/ 滚动代码
randomOutputStream = new BufferedRandomOutputStream(task.openRandomAccessFile(), OUTPUT_BUFFER_SIZE);
} catch (FileNotFoundException e) {
block.setThrowable(e);
e.printStackTrace();
isDone = true;
return;
HttpURLConnection conn = null;
long downloadPosition = 0;
try {
if(task.isSupportedContentRange()) {//断点续传
block.setDownloaded(Math.max(block.getDownloaded() - OUTPUT_BUFFER_SIZE, 0));// -8kb保证下载结果(有可能之前写入失败)
downloadPosition = block.getBegin() + block.getDownloaded();
randomOutputStream.seek(downloadPosition);
Properties reqProps = new Properties();
if(task.isSupportedContentRange()) {//设置下载范围
reqProps.setProperty("Range", "bytes=" + downloadPosition + "-" + block.getEnd());
conn = DLUtils.getChromeURLConnection(task.getUri(), false, reqProps);
InputStream in = new BufferedInputStream(DLUtils.getInputStream(conn.getInputStream(), conn.getContentEncoding()), INPUT_BUFFER_SIZE);
byte[] buf = new byte[INPUT_BUFFER_SIZE];
int len;
while((len = in.read(buf)) != -1) {
randomOutputStream.write(buf, 0, len);
block.updateDownloaded(len);
downloadPosition += len;
if(task.isSupportedContentRange() && downloadPosition >= block.getEnd()
|| isStop
|| !task.isRunning()) {
//也许将任务部分分配给了其他线程(增加了线程),在后面做详细处理
break;
} catch (IOException e) {
block.setThrowable(e);
e.printStackTrace();
} finally {
DLUtils.close(conn);
DLUtils.close(randomOutputStream);
isDone = true;
if(downloadPosition >= block.getEnd()) {
//块下载完成
block.setStatus(DLBlock.STATUS_DONE);
} else {
//停止下载
block.setStatus(DLBlock.STATUS_PAUSE);
try {//检查并设置任务状态
task.checkDone();
} catch (FileNotFoundException e) {
block.setThrowable(e);
e.printStackTrace();
public boolean isDone() {
return isDone;
}
public void stop() {
isStop = true;
}
0 0
- 多线程断点续传后台下载
- 多线程断点续传后台下载
- android 多线程断点续传下载
- 多线程断点续传后台下载
- 多线程并行下载,断点续传
- Android多线程.断点续传下载
- android 多线程断点续传下载
- Android 多线程下载断点续传
- Java多线程断点续传下载
- 多线程断点续传后台下载
- Android多线程断点续传下载
- 多线程断点续传下载Demo
- 多线程下载 断点续传
- 多线程断点续传下载
- 多线程断点续传下载。
- Android多线程断点续传下载
- JAVA多线程断点续传下载
- android多线程断点续传下载
- ubuntu上的fastdisk
- JavaScript离开页面事件
- 身份验证(公开密钥加密原理简介)
- oracle中char,varchar,VARCHAR2的区别
- 串口乱码
- 多线程下载 断点续传
- linux下安装7z命令及7z命令的使用
- Oracle解决 ORA-12514
- 三层架构—简析
- Java和poi导出excel报表
- 利用GOOGLE CACHE 缓存token
- Java 访问权限的表,总结的比较透彻。
- 仿刮刮乐刮奖效果
- ORACLE 日期函数 MONTHS_BETWEEN