使用HttpURLConnection多线程下载
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多线程下载的更多相关文章
- HttpURLConnection 多线程下载
影响下载的速度 * 宽带的带宽 * 服务器的限制 * 服务器的资源固定,开启的线程越多抢占的资源就越多 import java.io.InputStream; import java.io.Rando ...
- 多线程下载 HttpURLConnection
Activity /**实际开发涉及文件上传.下载都不会自己写这些代码,一般会使用第三方库(如xUtils)或Android提供的DownloadManager下载*/ public class Ht ...
- 使用HttpURLConnection实现多线程下载
HttpURLConnection继承了URLConnection,因此也可用于向指定网站发送GET请求.POST请求,而且它在URLConnection基础上提供了如下便捷方法: 实现多线程下载的步 ...
- java 多线程下载文件 以及URLConnection和HttpURLConnection的区别
使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- Java--使用多线程下载,断点续传技术原理(RandomAccessFile)
一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简 ...
- android 多线程下载 断点续传
来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- Java 仿迅雷多线程下载
package net.webjoy.jackluo.android_json; /** * 1.http Range "bytes="+ start+end * 2.Random ...
随机推荐
- python内置函数dir()
描述 dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:带参数时,返回参数的属性.方法列表.如果参数包含方法__dir__(),该方法将被调用.如果参数不包含__dir__(), ...
- PAT乙级:1094 谷歌的招聘 (20分)
PAT乙级:1094 谷歌的招聘 (20分) 题干 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址,而前面 ...
- 《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...
- 每天五分钟Go - 函数基础
函数在定义 Go的函数使用func来定义,返回类型支持多个值的返回 func 函数名([参数列]) [返回值类型]{ 方法执行体 } 参数列支持多个参数的声明,同一类型的函数,声明时和变量的声明一样 ...
- 第二十五篇 -- C++宝典中的图书管理系统
此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块. ...
- LinkedHashMap 的实现原理
LinkedHashMap 概述 HashMap 是无序的,HashMap 在 put 的时候是根据 key 的 hashcode 进行 hash 然后放入对应的地方.所以在按照一定顺序 put 进 ...
- 用webpack发布一个vue插件包
创建库 本来以为很简单,结果配置了webpack之后,运行build就报错了,似乎不认识es6语法,于是先后安装了几个包: @babel/core @babel/preset-env babel-lo ...
- js 时间戳转为日期
1 function time(){ //页面时间戳转换成时间 2 $(".time").each(function(){ 3 var time = $(this).text(); ...
- "virtualbox for mac安装器遇到了一个错误, 导致安装失败. 请联系软件制造商以获得帮助"的解决办法
virtualbox下载地址: https://www.virtualbox.org/wiki/Downloads 原因:"Mac OS 10.13.4 会阻止外部内核扩展的安装" ...
- CF877B Nikita and string TJ
前言的前言 本 TJ 同步发布于洛谷,在线求赞(bushi 前言 蒟蒻第一篇题解,在线求审核大大给过 awa. 如果此题解有什么问题的话欢迎各位大巨佬提出. 题目链接:CF877B 题目类型:dp,一 ...