使用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 ...
随机推荐
- 手写系列-实现一个铂金段位的 React
一.前言 本文基于 https://pomb.us/build-your-own-react/ 实现简单版 React. 本文学习思路来自 卡颂-b站-React源码,你在第几层. 模拟的版本为 Re ...
- 简单快速安装Apache+PHP+MySql服务环境(三)—— 下载安装phpmyadmin
为了方便在Linux上操作mysql数据库,打算安装一个phpmyadmin,不过在下载安装的过程中出现了一些坑,特此记录. 1. 在官网上下载phpmyadmin https://files.php ...
- Jmeter入门 浏览器设置代理服务器和录制脚本
第一步: 可以设置浏览器代理,本文章推荐使用火狐浏览器 在浏览器-首选项--网络设置里面设置代理服务器 注意:端口号可以自行设置,但是不可以与本机其他代理产生冲突 第二步: 打开jmeter工具,添加 ...
- JDK 和 CGLib 实现动态代理和区别
JDK 和 CGLib 实现动态代理和区别 在日常的开发中,Spring AOP 是一个非常常用的功能.谈到 AOP,自然离不开动态代理. 那么,基于 JDK 和 CGLib 如何实现动态代理,他们之 ...
- K8S系列第四篇(Dockerfile)
DokcerFile 镜像定制 更多精彩内容请关注微信公众号:新猿技术生态圈 定制docker镜像的方式有两种: 手动修改容器内容,导出新的镜像. 基于dockerfile自行编写指令,基于指令流程创 ...
- odoo12学习之javascript-----2
用例子:Creating a new field widget 这可能是一个非常常见的用例:我们希望以非常具体(可能依赖于业务)的方式在表单视图中显示一些信息. 例如,假设我们要根据某些业务条件更改文 ...
- 第五篇 -- git基础教程
git(权威指南)基础教程第一章 git -- gitbash -- cygwin git service:gitolite 两个的目录不同 gitbash ~ windows/home/admini ...
- 在js中对属性的操作
一:访问属性 两种方法: ①:对象名.属性名 function test(sno,age,sex){ this.sno=sno, this.age=age, this.sex=s ...
- CSS 格式 设置标签间距 和 input slot
作者:张艳涛 日期:2020-07-29 CSS设置俩个标签的间距 及 Input Slots <div> <div class="m-b-20 ovf-hd"& ...
- Java集合框架全解
Collection 集合 集合接口有2个基本方法: public interface Collection<E> { //向集合中添加元素.如果添加元素确实改变了集合就返回 true, ...