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. jumpserver 用户,系统用户和管理用户 普通用户和特权用户 区别

    前言 现在很多公司都有在用Jumpserver跳板机 有很多人一直对jumpserver的各种用户还不是很了解 当你了解了这几个概念了之后,就能更好的灵活的运用到分配权限当中去. 下面我们一个一个的说 ...

  2. CSP-S 2020

    游记 Day# 游记个鬼啊就在自家学校=-= 早上宿舍待不了,去机房颓废,看了几集猫和老鼠,并且把看门狗军团的流程看完了(真棒),甚至在考试之前把老师给的巧克力也吃完了. 期间zyt学长来摸鱼.他们今 ...

  3. .net 知新:【3】.net 5 项目结构说明和发布部署

    .net 5的项目目录结构和.net framework有些明显的变化,包括显示结构和项目文件,从这两个方面看看有哪些变化. 项目目录结构 就以上篇用的demo项目为例([.net 知新:[2] .N ...

  4. 不想用Spring全家桶?试试这个国产JFinal框架

    前言 逃离北上广从广州回老家南宁,入职这家公司用的技术是JFinal,借此机会得以学习这个国产的MVC框架,经过一段时间的学习,基于之前的经验搭建一个通用项目jfinal-demo jfinal-de ...

  5. 使用策略者模式减少switch case 语句

    策略者模式 很简单的一个定义:抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现. 场景 在这之前 ...

  6. 桌面小部件AppWidgetProvider简单分析

    1.一般桌面小部件涉及到的类 AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知 AppWidgetProvderInfo:AppWidget相关信息 ...

  7. Linux各目录及每个目录的详细介绍总结

    Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...

  8. Java数组02——三种初始化及内存分析

    内存分析 三种初始化 例子  package array; ​ public class ArrayDemon02 {     public static void main(String[] arg ...

  9. C++面向对象 1(类-封装)

    1 //类和对象 2 //C++ 面向对象 三大特性 : 封装 继承 多态 3 4 //设计一个圆类,求圆的周长 5 //圆周长 = 2*PI * 半径 6 7 #include <iostre ...

  10. 一份热乎的字节跳动客户端面经,已拿Offer

    字节面试过程: 4月4号进行内推,7天的简历评估,11号接到电话面试,尽管猝不及防回答仓促,但好在前期准备充分,通过.14号现场面试,次日收到通知,通过,二面.三面都很顺利.20号进行HR面,26号收 ...