文档章节

多线程下载一个文件

开源划水
 开源划水
发布于 2017/01/13 10:20
字数 524
阅读 4
收藏 0

学习了多线程下载文件

public class DownLoad2 {

    /**

     * 多线程下载

     * */

    private static long startTimeMillis = 0; // 开始时间

    private long endTimeMillis = 0; // 结束时间

 

    public void down() {

       startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间

       String url = "http://cyar.118320.com/imports/uploadFile/2016-07-011.xlsx";

       HttpClient client = new HttpClient();

       GetMethod method = new GetMethod(url);

       URL url2=null;

       try {

           url2 = new URL(url);

       } catch (MalformedURLException e1) {

           // TODO Auto-generated catch block

           e1.printStackTrace();

       }

       try {

           client.executeMethod(method);

           int length=Integer.valueOf(method.getResponseContentLength()+"");

              RandomAccessFile file = new RandomAccessFile("C:/Users/Administrator/Desktop/工作/b.xlsx","rw");//创建一个相同大小的文件。

              //7:设置文件大小,占位

              file.setLength(length);//设置文件大小。

        

              file.close();

              //8:定义线程个数

              int size = 3;

              //9:计算每一个线程应该下载多少字节的数据,如果正好整除则最好,否则加1

              int block = length/size==0?length/size:length/size+1;//计算每个线程应该下载的数据量。

             

              System.err.println("每个线程应该下载:"+block);

              for(int i=0;i<size;i++){

                  int start = i*block;

                  int end = start+(block-1);//计算每一个线程的开始和结束字节。

        

                System.err.println(i+"="+start+","+end);

                  new MyDownThread(start, end,url2).start();

              }

             

       } catch (HttpException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

        endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间

        System.out.println("执行时间:" + (endTimeMillis - startTimeMillis) + "ms;");

    }

     class MyDownThread extends Thread{

           //定义从何地开始下载

           private int start;

           //定义下载到哪一个字节

           private int end;

           private URL url;

           public MyDownThread(int start,int end,URL url){

               this.start=start;

               this.end=end;

               this.url=url;

           }

           @Override

           public void run() {

               try{

                  //11:开始下载

                  HttpURLConnection con =

                         (HttpURLConnection) url.openConnection();

                  con.setRequestMethod("GET");

                  //12:设置分段下载的请求头

                  con.setRequestProperty("Range","bytes="+start+"-"+end);//设置从服务器上读取的文件块。

                  //13:开始下载,需要判断206

                  if(con.getResponseCode()==206){//访问成功,则返回的状态码为206。

                      InputStream in = con.getInputStream();

                      //14:声明随机写文件对象,注意rwd是指即时将数据写到文件中,而不使用缓存区

                      RandomAccessFile out = new RandomAccessFile("C:/Users/Administrator/Desktop/工作/b.xlsx","rwd");

                      out.seek(start);//设置从文件的某个位置开始写数据。

                      byte[] b=new byte[1024];

                      int len = 0;

                      while((len=in.read(b))!=-1){

                         out.write(b,0,len);

                      }

                      out.close();

                      in.close();

                  }

                  System.err.println(this.getName()+"执行完成");

               }catch(Exception e){

                  throw new RuntimeException(e);

               }

             

           }

        }

    public static void main(String[] args) {

       DownLoad2 down=new DownLoad2();

       down.down();

    }

 

}

© 著作权归作者所有

开源划水

开源划水

粉丝 11
博文 22
码字总数 7528
作品 0
杭州
私信 提问
关于百度网盘中多文件打包下载并支持断点续传的技术实现

今天发现百度网盘中觉得一个很牛的功能,多文件打包下载并支持多线程以及断点续传 单从多文件打包下载这一点来说,实现起来很容易,创建一个压缩输出流即可: 但是这样只能进行单线程下载,并...

三千水军保裆
2018/05/12
2.5K
2
如何超级快的从你的vps下载一个很大的文件(served加axel使用)

简介 今天我准备吧我在谷歌相册中所有的文件都给下载过来,因为是谷歌相册,所以你懂的,我的操作是首先下载到我国外的vps上,之后从国外的vps下载到国内 操作 首先就是使用谷歌的takeout功能...

bboysoulcn
05/27
6
0
03-解析多线程与多进程的联系以及上下文切换所导致资源浪费问题

什么是进程?简单来讲就是运行中的程序,那么,何为运行中的程序呢?我们如何来看看进程呢?操作系统都是多进程的。我们通过任务管理器就可以看到操作系统中当前运行的很多的进程 我们写过的...

G_66_hero
2018/12/28
0
0
多线程大文件断点续传和流媒体的处理方法

在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下. 在Squid做反向代理时.其中有个rangeoffsetlimit的参数,意思是预先读取.还有...

蜗牛奔跑
2016/03/04
370
0
Linux操作系统的各种命令行下载工具介绍

  命令行下载工具   对于喜欢命令行操作及追求高效率、高速度下载的朋友,推荐使用命令行下载工具。命令行工具不但使用方便,而且大多具有很高的下载速度及下载效率,尤其适合于大批量下...

zt371
2009/05/07
765
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud 笔记之Spring cloud config client

观察者模式它的数据的变化是被动的。 观察者模式在java中的实现: package com.hxq.springcloud.springcloudconfigclient;import org.springframework.context.ApplicationListener;i...

xiaoxiao_go
昨天
6
0
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部