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. Junit测试用例配置Log4j

    用Junit测试非常方便,但有时我们想要看日志来方便排除,使用spring+log4j时,用Junit测试看日志很多人都不太会,即如何将Junit与log4j进行整合. 我也是研究了半天,才终于找到了 ...

  2. mac设置终端命令行别名alias(git、npm)

    别名(alias)通常被用作对一串或单个命令的简称.懒人必备!当常用到命令行操作的时候,每次输入一长串命令,不厌其烦,自然想到了用简称代替.这里主要介绍两种mac设置别名alias的方式. mac 设 ...

  3. 以初学者的角度理解:SQL实现关系除法

    以初学者的角度理解:SQL实现关系除法 相信各位在学习SQL的时候,由于没有一家SQL语言提供除法命令而只能自己写一个.而网上大多就是四步骤加一个模板: select distinct A.X fro ...

  4. VUP虚拟直播与光学动作捕捉技术

    虚拟直播将虚拟场景.虚拟形象实时显示在观众面前,虚拟场景与人物替代了原有的耗费较大搭建成本的实景场景与真人出镜,为观众带来全新的视觉体验,同时新技术降低了原有场景搭建成本,是近些年继AI.VR.动作捕 ...

  5. curl 简单介绍

    1.初始化2.设置变量3.执行并获取结果4.释放cURL句柄// 1. 初始化$ch = curl_init();// 2. 设置选项,包括URLcurl_setopt($ch, CURLOPT_UR ...

  6. XSS靶机

    第一关 localhost:8083/xss/level1.php?name=test<script>alert(1)</script> 第二关 源码 文本框输入js代码,查看 ...

  7. CF466C 题解

    Description 给定一个数组,求有多少组 \(i,j\) 将整个数组分成和相等的三个数组. Solution 从左往右看一遍,记录每一个 \(i\) 使得 \(\sum_{k=1}^i a_k ...

  8. Vue 脚手架学习

    首先就是安装脚手架 npm install @vue/cil -g 全局安装 在这里我遇到一个问题:安装不了脚手架,报错显示: 通过苦逼的查找原因就是 以前使用的taobao镜像 导致的,删除镜像换成 ...

  9. Spring Security项目的搭建以及Spring Security的BCrypt加密

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  10. MySQL-16-主从复制进阶

    延时从库 介绍 延时从库: 是我们人为配置的一种特殊从库,人为配置从库和主库延时N小时 为什么要有延时从库 数据库故障 物理损坏,普通的主从复制非常擅长解决物理损坏 逻辑损坏,普通主从复制没办法解决逻 ...