使用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 }
时间: 2024-11-23 14:24:58

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

多线程下载 HttpURLConnection

Activity /**实际开发涉及文件上传.下载都不会自己写这些代码,一般会使用第三方库(如xUtils)或Android提供的DownloadManager下载*/ public class HttpDownloadActivity extends ListActivity {     private TextView tv_info;     private LinearLayout ll_pbs;     public static final String PATH_URL_SMALL

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

【幻化万千戏红尘】qianfengDay27-HttpURLConnection,OkHttpClient,,多线程下载且断点续传基础学习:

课程回顾: Servlet:java语言开发的运行在服务器上的开发步骤:1.创建Servlet类2.重写doGet或doPost方法3.运行在服务器 生命周期:1.初始化2.服务3.销毁 URL:统一资源定位符,网址openConnection 今日内容:Http协议:超文本传输协议常用方式:1.HttpURLConnection2.okHttp HttpURLConnection的使用步骤:1.创建URL对象---URL url=new URL("网址");2.获取连接对象--Htt

java多线程下载

多线程下载是通过占有服务器资源来提高速度的.每个线程应该下载一个文件的不同位置,假如现在有一个长度为10的资源,有三个线程,那么第一个线程下载的长度为012,第二个为345,第四个为6789所以问题来了每个线程下载的长度是多少呢?线程的id为0,1,2每个线程下载的数量=总长度/线程数量size=10/3start:id*sizeend:(id+1)*size-1最后一个线程的结束位置为:总长度-1 package down; import java.io.File; import java.i

J哥---------Android 多线程下载 仿下载助手(改进版)

首先声明一点: 这里的多线程下载 并不是指的 多个线程下载一个 文件,而是 每个线程 负责一个文件.真正的多线程 希望后面能给大家带来.  -------------  欢迎 爱学习的小伙伴 加群  -------------  -------------android交流群:230274309------------- -------------一起分享,一起进步!  需要你们-------------- --------------  期待各位爱学习的小伙伴们 的到来------------

Android之——多线程下载示例(一)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载,Android API中明确要求将耗时的操作放到一个子线程中执行,文件的下载无疑是需要耗费时间的,所以要将文件的下载放到子线程中执行.下面,我们一起来实现一个Android中利用多线程下载文件的小例子. 二.服务端准备 在这个小例子中我以下载有道词典为例,在网上下载有道词典的安装包,在eclipse中新建项目web,将下载的

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

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

Android版多线程下载器核心代码分享

首先给大家分享多线程下载核心类: 1 package com.example.urltest; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.RandomAccessFile; 6 import java.net.HttpURLConnection; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 im

Android 之多线程下载原理

在Android之中呢,对于多线程的操作很是平凡,所以对于多线程的理解越深,那么对于自己的程序便能够很好的运行 这也是对于Android开发是一个重要的知识点,那么我们现在来了解多线程的下载原理. android 多线程下载 多线程下载步骤: 1.本地创建一个跟服务器一样的大小一样的文件 临时文件. 2.计算分配几个线程去下载服务器上的资源 每个文件下载的位置. 3.开启线程,每一个线程下载对应的文件. 4.如果所有的线程都把自己的数据下载完成了,服务器上的资源就被下载到本地了 如图所示:(假设