博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA多线程下载网络文件
阅读量:5772 次
发布时间:2019-06-18

本文共 4688 字,大约阅读时间需要 15 分钟。

hot3.png

JAVA多线程下载网络文件,开启多个线程,同时下载网络文件。

import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;/** * 说明: * 每一个线程下载的位置计算方式: * 开始位置: (线程id - 1) * 每一块大小 * 结束位置: (线程id*每一块大小) - 1  *  * 注意:有时候不一定能够整除,所以最后一个线程的结束位置应该是文件的末尾 *   *  步骤: *  1.本地创建一个大小跟服务器文件相同的临时文件 *  2.计算分配几个线程去下载服务器上的资源,知道每个线程下载文件的位置 *  3.开启三个线程,每一个线程下载对应位置的文件 *  4.如果所有的线程,都把自己的数据下载完毕后,服务器上的资源都被下载到本地了 *  * 作者: zhoubang  * 日期:2015年8月7日 上午11:20:06 */public class MultiThreadDownload {    public static String path = "http://static.csdn.net/public/common/toolbar/css/index.css"; // 要下载的网络资源文件路径    public static int threadCount = 10; // 开启的线程数    public static int runningThread = 10; // 记录已经运行的线程数量    public static long startTime;    private static final String filePath = "f:\\index.css"; //文件存放本地的路径    /**     * 测试下载     *      * 作者: zhoubang      * 日期:2015年8月7日 上午11:16:23     * @param args     * @throws Exception     */    public static void main(String[] args) throws Exception {        startTime = System.currentTimeMillis();        // 1.连接服务器,获取一个文件,获取文件的长度,在本地创建一个跟服务器一样大小的临时文件        URL url = new URL(path);        HttpURLConnection conn = (HttpURLConnection) url.openConnection();        conn.setConnectTimeout(5000);        conn.setRequestMethod("GET");        int code = conn.getResponseCode();        if (code == 200) {            // 服务器端返回的数据的长度,实际上就是文件的长度            int length = conn.getContentLength();            System.out.println("文件总长度:" + length);            // 在客户端本地创建出来一个大小跟服务器端一样大小的临时文件            RandomAccessFile raf = new RandomAccessFile(filePath, "rwd");            // 指定创建的这个文件的长度            raf.setLength(length);            raf.close();            // 假设是3个线程去下载资源。            // 平均每一个线程下载的文件大小.            int blockSize = length / threadCount;            for (int threadId = 1; threadId <= threadCount; threadId++) {                // 第一个线程下载的开始位置                int startIndex = (threadId - 1) * blockSize;                int endIndex = threadId * blockSize - 1;                if (threadId == threadCount) {// 最后一个线程下载的长度要稍微长一点                    endIndex = length;                }                System.out.println("线程:" + threadId + "下载:---" + startIndex + "--->" + endIndex);                new DownLoadThread(path, threadId, startIndex, endIndex).start();            }        } else {            System.out.printf("服务器错误!");        }    }    /**     * 下载文件的子线程,每一个线程下载对应位置的文件     *      * 作者: zhoubang      * 日期:2015年8月7日 上午11:16:34     */    public static class DownLoadThread extends Thread {        private int threadId;        private int startIndex;        private int endIndex;        /**         * @param path         *            下载文件在服务器上的路径         * @param threadId         *            线程Id         * @param startIndex         *            线程下载的开始位置         * @param endIndex         *            线程下载的结束位置         */        public DownLoadThread(String path, int threadId, int startIndex, int endIndex) {            super();            this.threadId = threadId;            this.startIndex = startIndex;            this.endIndex = endIndex;        }        @Override        public void run() {            try {                URL url = new URL(path);                HttpURLConnection conn = (HttpURLConnection) url.openConnection();                conn.setConnectTimeout(5000);                conn.setRequestMethod("GET");                // 重要:请求服务器下载部分文件 指定文件的位置                conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex);                // 从服务器请求全部资源返回200 ok如果从服务器请求部分资源 返回 206 ok                int code = conn.getResponseCode();                System.out.println("code:" + code);                InputStream is = conn.getInputStream();// 已经设置了请求的位置,返回的是当前位置对应的文件的输入流                RandomAccessFile raf = new RandomAccessFile(filePath, "rwd");                // 随机写文件的时候从哪个位置开始写                raf.seek(startIndex);// 定位文件                int len = 0;                byte[] buffer = new byte[1024];                while ((len = is.read(buffer)) != -1) {                    raf.write(buffer, 0, len);                }                is.close();                raf.close();                System.out.println("线程:" + threadId + "下载完毕");                System.out.println((System.currentTimeMillis() - startTime));            } catch (Exception e) {                e.printStackTrace();            } finally {                runningThread--;                if (runningThread == 0) {// 所有的线程执行完毕                    System.out.println("文件全部下载完毕!");                }            }        }    }}

 

 

     文章转载地址:http://www.cnblogs.com/zhoubang521/p/5200015.html

 

转载于:https://my.oschina.net/u/2263802/blog/908762

你可能感兴趣的文章
人生苦短
查看>>
安装nextant
查看>>
单点登录解决方案
查看>>
常用lua代码块
查看>>
Oracle11g 安装 -Linux
查看>>
android 广播分类
查看>>
JavaScript继承详解(六)
查看>>
date日期类型
查看>>
Codeforces Round #160 (Div. 2) A. Roma and Lucky Numbers
查看>>
JSP和Struts2、Hibernate、Spring3基础内容和原理
查看>>
’白帽子‘被起诉所见所想
查看>>
python获取文件
查看>>
翻译研讨 2009/10/17 财经新闻《国外投资再次向印度流动》
查看>>
PSP0级 周活动总结表+时间记录日志+缺陷记录日志 表格模板
查看>>
多种方式实现ul中的li居中的利弊
查看>>
mac安装brew和nginx
查看>>
UIButton
查看>>
Android获取各种设备的状态
查看>>
区块链开发_以太坊测试功能
查看>>
CodeChef November Challenge 2013 解题报告
查看>>