package com.test.download;
 
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
 
/*
 * 多线程下载
 */
public class MulThreadDownload {
 
    public static void main(String[] args) throws Exception {
        String path = "http://pic.4j4j.cn/upload/pic/20130909/681ebf9d64.jpg";
        new MulThreadDownload().download(path,3);
    }
     
    public void download (String path,int threadsize) throws Exception{
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            //获取网络文件长度
            int length = conn.getContentLength();  
            //新建本地文件保存下载数据
            File file = new File(getFilename(path));
            //计算每条线程负责下载的数据量
            int block = length%threadsize==0 ? length/threadsize : length/threadsize+1;
            //开启指定数目的线程同时下载
            for(int threadid = 0; threadid < threadsize; threadid++){
                new DownloadThread(threadid,block,url,file).start();
            }
        }else{
            System.out.println("下载失败!");
        }
    }
     
    private class DownloadThread extends Thread{
        private int threadid;   //线程编号
        private int block;      //下载块大小
        private URL url;        //下载链接
        private File file;      //下载数据保存文件
        public DownloadThread(int threadid, int block, URL url, File file) {
            this.threadid = threadid;
            this.block = block;
            this.url = url;
            this.file = file;
        }
 
        public void run() {
            int start = threadid * block;       //本线程下载数据写入文件开始位置
            int end = (threadid+1) * block - 1; //本线程下载数据写入文件结束位置
            try {
                //创建一个随机访问文件流对象
                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
                //文件指针偏移至正确写入位置
                accessFile.seek(start);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");
                //设置请求数据的范围
                conn.setRequestProperty("Range", "bytes="+start+"-"+end);
                if(conn.getResponseCode() == 206){//状态码206:(部分内容) 服务器成功处理了部分 GET 请求
                    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();
            }
        }
    }
 
    private String getFilename(String path) {
        return path.substring(path.lastIndexOf("/")+1);
    }
}

Java多线程下载文件的更多相关文章

  1. java 多线程下载文件 以及URLConnection和HttpURLConnection的区别

    使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...

  2. java 多线程下载文件并实时计算下载百分比(断点续传)

    多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...

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

    多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; impor ...

  4. 最新---java多线程下载文件

    import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...

  5. JAVA多线程下载网络文件

    JAVA多线程下载网络文件,开启多个线程,同时下载网络文件.   源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...

  6. java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例

    什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...

  7. java多线程下载和断点续传

    java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...

  8. 多线程下载文件,ftp文件服务器

    1: 多线程下载文件 package com.li.multiplyThread; import org.apache.commons.lang3.exception.ExceptionUtils; ...

  9. Java多线程下载分析

    为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...

随机推荐

  1. 【16】vuex2.0 之 getter

    有的组件中获取到 store 中的state,  需要对进行加工才能使用,computed 属性中就需要写操作函数,如果有多个组件中都需要进行这个操作,那么在各个组件中都写相同的函数,那就非常麻烦,这 ...

  2. 一些汇编中的 trick

    1. PC 总是指向下一条将要被执行的指令,而不是指向正在被执行的指令,这是有道理的,因为执行指令不是一个 atom 过程,而是分成了好多步骤,在执行指令的过程中 cpu 完全有可能将下一条将要执行的 ...

  3. 利用$.getJSON() 跨域请求操作

    原文发布时间为:2011-01-14 -- 来源于本人的百度文章 [由搬家工具导入] $.get 没有权限? $.post 没有权限? 因为他们都不能跨域,那就用 $.getJSON() 吧 利用$. ...

  4. 乌班图中的ssh服务

    SSH服务(TCP端口号22):安全的命令解释器                                     为客户机提供安全的Shell 环境,用于远程管理                ...

  5. 刷leetcode是什么样的体验?【转】

    转自:https://www.zhihu.com/question/32322023 刷leetcode是什么样的体验? https://leetcode.com/ 1 条评论   默认排序 按时间排 ...

  6. 四、Ubuntu 一些常用命令

    1.锁定root用户 :sudo passwd -l root 2.解锁root用户 :sudo passwd -u root 3.切换身份:su root  或者  su 其他用户名,然后输入密码, ...

  7. 洛谷——1508 Likecloud-吃、吃、吃

    题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏 ...

  8. Ubuntu 16.04下IntelliJ IDEA菜单显示乱码的问题解决

    说明:这个问题一般是Ubuntu安装时默认使用了中文,而IDEA默认是以系统默认字体为主,所以就会出现乱码:要解决这种问题,就是在IDEA启动时强制设置为英文. 解决方式: 在idea.vmoptio ...

  9. 为Zepto添加Slide动画效果

    一.缘由 公司的移动端项目,采用zepto为主要框架,但是zepto毕竟是精简版的jquery,体积小了,功能自然没有这么强大,特别是动画和选择器这两块,需要我们自己去拓展. 在项目开发过程中,很多页 ...

  10. 批量去掉文件中的^M

    "^M"在Linux下的输入方法 ctrl v + ctrl m 方案一: find -type f | xargs sed -i 's/^M//g' 或者 find -name ...