多线程下载文件,以及断点下载

一:前言

多线程下载文件,可能有的同学没有过多的听说过,但是断点下载肯定是听过的,也就是说像讯雷,哪怕你把电脑重启了,讯雷重新启动后也会接着原来的地方下载,那么这是怎么做到的呢?

二:代码示例

直接给出代码,

2.1、经典代码

两行经典的代码分别为:

//设置下载的开始及结束位置
conn.setRequestProperty("Range", "bytes="+start+"-"+end+"");
//设置读写的起点位置
RandomAccessFile raf = new RandomAccessFile("e:/test/temp.exe","rw");
raf.seek(start);

2.2、完整代码:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;

public class Demo {
    /**
     * 下载线程数量<br>
     * 我用5个线程下载用了37秒,用1个线程下载用了45秒
     */
    private static int num = 5;

    public static void main(String[] args) {
        threadDown();
    }

    public final static void threadDown() {
        try {
            URL url = new URL("http://dldir1.qq.com/qqfile/qq/QQ8.2/17724/QQ8.2.exe");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            int size = conn.getContentLength();
            // 每个纯种下载该大小
            int block = size / num;

            // 这个类支持对于文件的随机访问,第一个参数是文件名,第二个是访问模式,rw代表读写
            RandomAccessFile raf = new RandomAccessFile("e:/test/temp.exe","rw");
            // 在本地创建一个空文件,大小与服务器的文件保持一致
            raf.setLength(size);
            raf.close();

            // 定义一个开始下载的位置,结束下载的位置
            int start;
            int end;
            for (int i = 0; i < num; i++) {
                start = i * block;
                if (num == i + 1) {
                    end = size;
                } else {
                    end = block * (i + 1);
                }
                System.out.println("开始:" + start + ", 结束:" + end);
                ThreadDown down = new ThreadDown(start,end);
                down.start();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class ThreadDown extends Thread{
    private int start;
    private int end;
    public ThreadDown(int start,int end){
        this.start = start;
        this.end = end;
    }
    public void run() {
        long startTime = new Date().getTime();
        String name = Thread.currentThread().getName();
        try {
            System.out.println(name + ":启动");
            URL url = new URL("http://dldir1.qq.com/qqfile/qq/QQ8.2/17724/QQ8.2.exe");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //这里也是重点,设置了请求的开始字节与结束字节
            conn.setRequestProperty("Range", "bytes="+start+"-"+end+"");
            InputStream in = conn.getInputStream();

            RandomAccessFile raf = new RandomAccessFile("e:/test/temp.exe","rw");
            //设置读写的起点位置,这里是重点
            raf.seek(start);
            byte[] buf = new byte[1024];
            int len = 0;
            while((len=in.read(buf))!= -1){
                raf.write(buf, 0, len);
            }

            in.close();
            raf.close();
            long endTime = new Date().getTime();
            long useTime = (endTime - startTime) / 1000;
            System.out.println(name + "下载完成,共耗时:" + useTime + "秒");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

三:断点下载

想来看过了上面的代码,断点下载的原理大家肯定也是知道了,同样的也是采用

//设置下载的开始及结束位置
conn.setRequestProperty("Range", "bytes="+start+"-"+end+"");
//设置读写的起点位置
RandomAccessFile raf = new RandomAccessFile("e:/test/temp.exe","rw");
raf.seek(start);
时间: 2024-10-22 19:36:17

多线程下载文件,以及断点下载的相关文章

java多线程下载文件和断点下载

多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile;

Python HTTP下载文件并显示下载进度条

下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: import urllib import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() url = "https://raw.githubusercontent.com/racaljk/hosts/maste

iOS网络-NSURLSessionDataTask大文件离线断点下载

什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> //输出流 @property (nonatomic, strong) NSOutputStream *stream ; //Task对象 @property (nonatomic, strong) NSURLSessionDataT

使用NSURLSessionDataTask实现大文件离线断点下载(完整)

6.1 涉及知识点 (1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputStream *stream = [[NSOutputStream alloc]initWithURL:[NSURL fileURLWithPath:[self fullPath]] append:YES]; //2. 打开流 [stream open]; //3. 写入流数据 [stream wri

Http 下载文件,指定下载位置

HTTP协议简介 下载文件是电脑与WEB服务器交互的过程,它们交互的"语言"的专业名称是协议.传送文件的协议有多种,最常用的是HTTP(超文本传输协议)和FTP(文件传送协议),我采用的是HTTP. HTTP协议最基本的命令只有三条:Get.Post和Head.Get从WEB服务器请求一个特定的对象,比如HTML页面或者一个文件,WEB 服务器通过一个Socket连接发送此对象作为响应:Head命令使服务器给出此对象的基本描述,比如对象的类型.大小和更新时间.Post命令用于向 WEB

libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/1420791/blog/198247 转载:http://www.cnblogs.com/flylong0204/p/4723155.html 转载:http://www.tuicool.com/articles/VNRzEbq 转载:http://blog.csdn.net/hei_ya/article/

解决jsp下载文件,迅雷下载路径不显示文件名称的问题

如果浏览器安装了迅雷的插件,在jsp页面调用java后台实现文件下载功能时,会自动弹出迅雷下载,迅雷的下载路径会显示.do或者.xhtml之类的,为了解决这个问题,jsp页面修改如下: 写一个<a>标签在页面上: <a id="downloadUrl" target="_blank"></a> 导出按钮如下: <a href="javascript:void(0)" id="biz_exp_bu

下载文件:AJAX下载效果

//下载 function Download(id) { var form = $("<form>"); //定义一个form表单 form.attr('style', 'display:none'); //在form表单中添加查询参数 form.attr('target', ''); form.attr('method', 'post'); form.attr('action', "/task/DetailDownload"); var input1

iOS 下载功能:断点下载(暂停和开始)(NSURLConnectionDataDelegate方法)

1,model文件代码 文件名称:HMFileDownloader.h #import <Foundation/Foundation.h> @interface HMFileDownloader : NSObject /** * 所需要下载文件的远程URL(连接服务器的路径) */ @property (nonatomic, copy) NSString *url; /** * 文件的存储路径(文件下载到什么地方) */ @property (nonatomic, copy) NSString

C# WebBrowser控件 下载文件不弹下载提示框的办法

参考链接 https://stackoverflow.com/questions/6773866/download-file-and-automatically-save-it-to-folder public class MyWebBrowser : WebBrowser { /// <summary> /// The URLMON library contains this function, URLDownloadToFile, which is a way /// to downloa