多线程下载 断点续传

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 {
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 { http://www.huiyi8.com/gundongdaima/ 滚动代码
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;
}

多线程下载 断点续传

时间: 2024-10-09 14:48:02

多线程下载 断点续传的相关文章

Java--使用多线程下载,断点续传技术原理(RandomAccessFile)

一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简单说一个进程可以由多个线程组成,一个操作系统可以多个进程,它们都是可以同时进行工作的. 2.什么是下载?如何多线程进行下载?如何断点续传? 广义上说,凡是在屏幕上看到的不属于本地计算机上的内容,皆是通过"下载"得来.狭义上人们只认为那些自定义了下载文件的本地磁盘存储位置的操作才是"

Android多线程下载断点续传

先上图看卡结果: GITHUB:Android多线程下载断点续传 如图所示点击下载就开始下载,点击停止就会停止再次点击下载就会接着下载了. 设计思路是这样的: 首先通过广播将下载信息传递给DownService,DownService根据文件URL获取文件大小,再通过DownTask将下载任务分配,并且通过广播当点击停止下载时将下载进度保存在数据库中,当点击开始下载时再从数据库中获取到保存的进度,继续下载. 代码结构: 核心类是 DownLoadService,java 和DownTask.ja

Java多线程下载器FileDownloader(支持断点续传、代理等功能)

前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownloader 目前实现的主要功能有: 多线程下载 断点续传 自定义头部等 即将完成的包括: 添加代理功能 ... 感觉做了回标题党,代理功能由于时间关系,将在下次更新加入. 关于设置代理,我这篇文章 Java实现Ip代理池 中有具体的设置方法. 另外除了这个代理功能,我也实在不知道下载器能加些啥功能了..

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

【幻化万千戏红尘】qianfengDay27-HttpURLConnection,OkHttpClient,,多线程下载且断点续传基础学习:

课程回顾: Servlet:java语言开发的运行在服务器上的开发步骤:1.创建Servlet类2.重写doGet或doPost方法3.运行在服务器 生命周期:1.初始化2.服务3.销毁 URL:统一资源定位符,网址openConnection 今日内容:Http协议:超文本传输协议常用方式:1.HttpURLConnection2.okHttp HttpURLConnection的使用步骤:1.创建URL对象---URL url=new URL("网址");2.获取连接对象--Htt

多线程下载文件(支持暂停、取消、断点续传)

多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne

基于http的断点续传和多线程下载

HTTP协议的GET方法,支持只请求某个资源的某一部分: 206 Partial Content 部分内容响应: Range 请求的资源范围: Content-Range 响应的资源范围: 断点续传: 在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传. 分块请求资源实例: Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分: Eg2:Content-Range: bytes 306302-604047/6040

Android开发--多线程下载加断点续传

文件下载在App应用中也用到很多,一般版本更新时多要用的文件下载来进行处理,以前也有看过很多大神有过该方面的博客,今天我也自己来实践一下,写的一般,还请大家多提意见,共同进步.主要思路: 1.多线程下载: 首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount:得到每一段下载量:每一段的位置是i * range到(i + 1) * rang  - 1,注意最后一段的位置是到filesize - 1: 通过Http协议的Range字段实现

断点续传---多线程下载进阶(一)

打算总结7篇笔记,来学习下断点续传---多线程下载进阶 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sms.down" android:versionCode="1&quo