多线程断点下载文件

原创 2016年08月28日 14:10:51


package cn.itcast.download;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class MulThreadDownloader {

    public static void main(String[] args) throws Exception {
        String path = "http://192.168.1.100:8080/web/QQWubiSetup.exe";
        int threadsize = 3;
        new MulThreadDownloader().download(path, threadsize);

    }

    private void download(String path, int threadsize) throws Exception {
        URL downpath = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            int length = conn.getContentLength();//获取网络文件的长度
            File file = new File(getFileName(path));
            RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");//生成本地文件
            accessFile.setLength(length);
            accessFile.close();
            //计算每条线程负责下载的数据量
            int block = length % threadsize == 0 ? length / threadsize : length / threadsize +1;
            for(int threadid = 0 ; threadid < threadsize ; threadid++){
                new DownloadThread(threadid, downpath, block, file).start();
            }
        }
    }
    //负责下载操作
    private final class DownloadThread extends Thread{
        private int threadid;
        private URL downpath;
        private int block;
        private File file;
        
        public DownloadThread(int threadid, URL downpath, int block, File file) {
            this.threadid = threadid;
            this.downpath = downpath;
            this.block = block;
            this.file = file;
        }
        public void run() {
            int startposition = threadid * block;//从网络文件的什么位置开始下载数据
            int endposition = (threadid+1) * block - 1;//下载到网络文件的什么位置结束
            //指示该线程要从网络文件的startposition位置开始下载,下载到endposition位置结束
            //Range:bytes=startposition-endposition
            try{
                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
                accessFile.seek(startposition);//移动指针到文件的某个位置
                HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);
                InputStream inStream = conn.getInputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while( (len = inStream.read(buffer)) != -1 ){
                    accessFile.write(buffer, 0, len);
                }
                accessFile.close();
                inStream.close();
                System.out.println("第"+ (threadid+1)+ "线程下载完成");
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 获取文件名称
     * @param path 下载路径
     * @return
     */
    private static String getFileName(String path) {
        return path.substring(path.lastIndexOf("/")+ 1);
    }

}


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1772844

版权声明:本文为博主原创文章,未经博主允许不得转载。

多线程断点文件下载实现

文件下载这种操作经常会出现,当文件较大的时候,假如不采用多线程断点下载,那么当下载到一半出错或者暂停的话,就需要从最开始重新来下载了,这点是没什么必要的,因为我们完全可以从上一次出错的地方继续下载,就...
  • hzw19920329
  • hzw19920329
  • 2016年04月24日 21:37
  • 1814

Java代码实现多线程下载和断点续传

- 多线程下载原理 客户端要下载一个文件, 首先请求服务器,服务器将这个文件传送给客户端,客户端保存到本地, 完成了一个下载的过程. 多线程下载的思想是客户端开启多个线程同时下载,每个线程只负责下载文...
  • qq_32101859
  • qq_32101859
  • 2016年11月15日 21:10
  • 4678

多线程断点下载详解

首先先理清一下逻辑,后面会贴上源代码,里面有详细的解释,根据前面的逻辑去看后面的源码能够很快掌握断点下载。续传也是同样的道理。 看源码之前需要了解的知识:使用Http的Range头字段可以指定每条线程...
  • chencangui
  • chencangui
  • 2015年05月02日 16:10
  • 963

OkHttp实现多线程断点续传下载,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧

最近项目需要使用到断点下载功能,笔者比较喜欢折腾,想方设法抛弃SharedPreferences,尤其是sqlite作记录辅助,改用临时记录文件的形式记录下载进度,本文以断点下载为例。...
  • ausboyue
  • ausboyue
  • 2017年05月03日 22:01
  • 2978

多线程断点下载文件

MainActivity.java public class MainActivity extends Activity implements android.view.View.OnClickLis...
  • wuqingyidongren
  • wuqingyidongren
  • 2016年04月05日 14:38
  • 436

多线程断点下载文件

hello 大家好!习惯了记录点点滴滴。 十一在家太无聊了,又想到最经
  • panlunyou
  • panlunyou
  • 2014年10月03日 17:48
  • 361

多线程断点下载文件

所谓多线程断点下载 :就是当某个文件下了一部分后突然断电了,或者下载程序暂停了,再次运行下载 可以继续下载,而不是重新下载 的一个执行过程。 基本模拟了迅雷下载的原理 本次功能用java实现 : ...
  • koproblem
  • koproblem
  • 2017年04月11日 09:58
  • 75

Android FTP 多线程断点续传下载\上传

最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载。FTP下载原理FTP单线程断点续传FTP和传统的HTT...
  • qwe511455842
  • qwe511455842
  • 2017年08月03日 09:24
  • 511

大文件 and 多下载任务的封装(三)--断点续传,下载类的整合封装,以及使用

ThreadManager大文件 and 多下载任务的封装一 大文件 and 多下载任务的封装二 原文地址 上两篇文章中我们主要讲述了ThreadPool ,以及 Observer(观察者模式...
  • MyLoveyaqiong
  • MyLoveyaqiong
  • 2016年11月13日 08:47
  • 1176

在Http协议下实现多线程断点的下载

0.使用多线程下载会提升文件下载的速度,那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度     HttpURLConnection.getContentLeng...
  • yinbucheng
  • yinbucheng
  • 2016年07月11日 20:41
  • 861
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程断点下载文件
举报原因:
原因补充:

(最多只允许输入30个字)