1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.io.RandomAccessFile;
4 import java.net.HttpURLConnection;
5 import java.net.MalformedURLException;
6 import java.net.ProtocolException;
7 import java.net.URL;
8
9 /**
10 * 线程类
11 * @author Administrator
12 *
13 */
14 public class DownThread extends Thread{
15
16 private String path;
17 private int startPos;
18 private int currentPartSize;
19 private RandomAccessFile currentPart;
20
21 public int length;
22
23 public DownThread(String path, int startPos, int currentPartSize,
24 RandomAccessFile currentPart) {
25
26 this.path = path;
27 this.startPos = startPos;
28 this.currentPartSize = currentPartSize;
29 this.currentPart = currentPart;
30 }
31
32 @Override
33 public void run() {
34 try {
35 URL url = new URL(path);
36 HttpURLConnection conn;
37 conn = (HttpURLConnection)url.openConnection();
38 /* 设置超时时长 */
39 conn.setConnectTimeout(5000);
40 /* 设置发送请求的方法 */
41 conn.setRequestMethod("GET");
42
43 conn.setRequestProperty("Accept", "image/gif, image/x-xbitmap, " +
44 "image/jpeg, image/pjpeg, application/x-shockwave-flash, " +
45 "application/vnd.ms-excel, application/vnd.ms-powerpoint, " +
46 "application/msword, application/x-silverlight, */*");
47
48 conn.setRequestProperty("Accept-Language", "zh-CN");
49 conn.setRequestProperty("Charset", "UTF-8");
50 /* 返回该Socket对象对应的输出流,让程序通过该输入流从Socket中取出数据 */
51 InputStream inStream = conn.getInputStream();
52 inStream.skip(startPos);//寻到开始下载的位置
53 byte[] buffer = new byte[1024];
54 int hasRead = 0;
55 while(length < currentPartSize && (hasRead = inStream.read(buffer)) > 0){
56 currentPart.write(buffer, 0, hasRead);
57 length += hasRead;
58 }
59 currentPart.close();
60 inStream.close();
61 } catch (MalformedURLException e) {
62 e.printStackTrace();
63 } catch (ProtocolException e) {
64 e.printStackTrace();
65 } catch (IOException e) {
66 e.printStackTrace();
67 }
68 }
69
70
71 }
 1 import java.io.RandomAccessFile;
2 import java.net.HttpURLConnection;
3 import java.net.URL;
4
5
6 public class DownUtil {
7 /* 下载资源的路径--url */
8 private String path;
9 private String targetFile;
10 private int threadNum;
11 /* 多线程下载 */
12 private DownThread[] threads;
13 private int fileSize;
14 public DownUtil(String path, String targetFile, int threadNum) {
15
16 this.path = path;
17 this.targetFile = targetFile;
18 threads = new DownThread[threadNum];
19 this.threadNum = threadNum;
20 }
21
22 public void download() throws Exception{
23 URL url = new URL(path);
24 HttpURLConnection conn;
25 conn = (HttpURLConnection)url.openConnection();
26
27 conn.setConnectTimeout(5000);
28
29 conn.setRequestMethod("GET");
30
31 conn.setRequestProperty("Accept", "image/gif, image/x-xbitmap, " +
32 "image/jpeg, image/pjpeg, application/x-shockwave-flash, " +
33 "application/vnd.ms-excel, application/vnd.ms-powerpoint, " +
34 "application/msword, application/x-silverlight, */*");
35
36 conn.setRequestProperty("Accept-Language", "zh-CN");
37 conn.setRequestProperty("Charset", "UTF-8");
38 conn.setRequestProperty("Connection", "Keep-Alive");
39 /* 得到文件的大小 */
40 fileSize = conn.getContentLength();
41 conn.disconnect();
42 int currentPartSize = fileSize / threadNum + 1;
43 RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
44 /* 设置本地文件的大小 */
45 file.setLength(fileSize);
46 file.close();
47
48 for (int i = 0; i < threadNum; i++) {
49 int startPos = i * currentPartSize;
50 /* 每个线程使用一个RandomAccessFile进行下载 */
51 RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
52 /* 定位文件下载的位置*/
53 currentPart.seek(startPos);
54 threads[i] = new DownThread(path, startPos, currentPartSize, currentPart);
55 threads[i].start();
56 }
57 }
58
59 public double getCompleteRate(){
60 int sumSize = 0;
61 for (int i = 0; i < threadNum; i++) {
62 sumSize += threads[i].length;
63 }
64 return sumSize * 1.0 / fileSize;
65 }
66 }

使用HttpURLConnection多线程下载的更多相关文章

  1. HttpURLConnection 多线程下载

    影响下载的速度 * 宽带的带宽 * 服务器的限制 * 服务器的资源固定,开启的线程越多抢占的资源就越多 import java.io.InputStream; import java.io.Rando ...

  2. 多线程下载 HttpURLConnection

    Activity /**实际开发涉及文件上传.下载都不会自己写这些代码,一般会使用第三方库(如xUtils)或Android提供的DownloadManager下载*/ public class Ht ...

  3. 使用HttpURLConnection实现多线程下载

    HttpURLConnection继承了URLConnection,因此也可用于向指定网站发送GET请求.POST请求,而且它在URLConnection基础上提供了如下便捷方法: 实现多线程下载的步 ...

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

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

  5. 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】

    一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...

  6. Java--使用多线程下载,断点续传技术原理(RandomAccessFile)

    一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简 ...

  7. android 多线程下载 断点续传

    来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...

  8. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  9. Java 仿迅雷多线程下载

    package net.webjoy.jackluo.android_json; /** * 1.http Range "bytes="+ start+end * 2.Random ...

随机推荐

  1. ORM研究3 - odoo fields常用的字段属性

    之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的一些通用属性字段的使用,学会它们可以为自己创建数据映射并使用有更好的帮助. 通用字段属 ...

  2. C++11 左值引用和右值引用与引用折叠和完美转发

    1.左值与右值 最感性的认识. 当然,左值也是可以在右边的. 左值是可以被修改的,右值不能. 当然取地址也是. 生存周期一般左值会比右值的长,一般右值都计算时产生的无名临时对象,存在时间比较短. 下面 ...

  3. 【LeetCode】86. 分隔链表

    86. 分隔链表 知识点:链表: 题目描述 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前. 你应当 保留 两个 ...

  4. ES6 箭头函数及this

    ES6 箭头函数及this 1.箭头函数 <script type="text/javascript"> //以前定义函数 let fun=function () { ...

  5. windows程序快速启动的方式:WIN键+R

    WIN键+R是windows快速启动程序的一种方式,一般能独立运行的程序都能以这种方式启动.如notepad.calc.explorer等程序. 在命令行方式下explorer加上不同的参数,会得到不 ...

  6. Java的标准日志

    虽然开源社区有很多优秀的日志框架,但我们学习标准的java日志框架是为了更好的理解其他框架啊(近期项目要用ELK) 看自己以前写的Log4J简直不忍直视啊啊啊啊,那时还感觉自我良好 1. 为什么要使用 ...

  7. 03_Nginx支持SSL

    1.申请证书 https://freessl.cn/ 2.创建证书 3.离线生产 4.下载Keymanager https://keymanager.org/ 5.打开生产密钥 6.DNS验证 进入域 ...

  8. 使用Pycharm创建Django项目无法创建app.

    Python3.7使用Django1.11.7创建Django项目报以下错误时: 在使用Pycharm创建Django项目报以下错误时: Traceback (most recent call las ...

  9. 规模化敏捷 LeSS(三):LeSS Huge 是怎样炼成的?

    上篇文章< LeSS 团队实践指南>中讲到 LeSS 框架中的团队数量不要超过8个,但8个以上的团队要如何实践敏捷呢? 为了应对8个以上团队实践敏捷的情况,Bas 以及 Carig 还提出 ...

  10. 抽奖动画 - lao虎机抽奖

    本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...