您的位置:首页 > 理论基础 > 计算机网络

使用HttpUrlConnection多线程下载文件

2017-01-22 15:04 399 查看
package com.example.administrator.myapplication;

import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
* Created by Mr.MJ on 2017/1/22.
*/

public class DownUtil {
//定义下载的资源路径
private String path;
//下载文件保存路径
private String targetFile;
//定义下线线程条数
private int threadNum;
//定义下载线程的对象
private DownThread[] downThreads;
//下载文件大小
private int fileSize;

public DownUtil(String path, String targetFile, int threadNum) {
this.path = path;
this.targetFile = targetFile;
this.threadNum = threadNum;
//初始化downThreads数组
downThreads=new DownThread[threadNum];
}

public  void download(){
try {
URL url=new URL(path);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept","image/gif,image/jpeg,image/pjpeg,image/pjpeg,"
+"application/x-shockwave-flash,application/xaml+xml,"
+"application/vnd.ms-xpsdocument,application/x-ms-xbap,"
+"application/x-ms-application,application/vnd.ms-excel,"
+"application/vnd.ms-powerpoint,application/msword,*/*");
conn.setRequestProperty("Acceppt-Language","zh-CN");
conn.setRequestProperty("Charset","UTF-8");
conn.setRequestProperty("Connection","Keep_Alive");
//得到文件的大小
fileSize= conn.getContentLength();
int currentPartSize=fileSize/threadNum+1;
RandomAccessFile file=new RandomAccessFile(targetFile,"rw");
file.setLength(fileSize);
file.close();

for(int i=0;i<threadNum;i++){
//定义每个线程下载的起始位置
int startPos=i*currentPartSize;
RandomAccessFile currentPart=new RandomAccessFile(targetFile,"rw");
//定义该线程的下载位置
currentPart.seek(startPos);
downThreads[i]=new DownThread(startPos,currentPartSize,currentPart);
downThreads[i].start();
}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//计算进度条进度
public double getComplete(){
int sizeSum=0;
for(int i=0;i<threadNum;i++){
sizeSum+=downThreads[i].length;
}
return  sizeSum*1.0/fileSize;
}

private class DownThread extends Thread{
//当前线程的下载位置
private int startPos;
//当前线程负责下载的文件大小
private int currentPartSize;

public DownThread(int startPos,int currentPartSize,RandomAccessFile currentPart) {
this.startPos = startPos;
this.currentPartSize=currentPartSize;
this.currentPart=currentPart;
}

//当前线程需要下载的文件块
private RandomAccessFile currentPart;
//定义线程已下载的字节数
private int length;

@Override
public void run() {
try {
URL url=new URL(path);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept","image/gif,image/jpeg,image/pjpeg,image/pjpeg,"
+"application/x-shockwave-flash,application/xaml+xml,"
+"application/vnd.ms-xpsdocument,application/x-ms-xbap,"
+"application/x-ms-application,application/vnd.ms-excel,"
+"application/vnd.ms-powerpoint,application/msword,*/*");
conn.setRequestProperty("Acceppt-Language","zh-CN");
conn.setRequestProperty("Charset","UTF-8");
conn.setRequestProperty("Connection","Keep_Alive");
InputStream inputStream = conn.getInputStream();
skipFully(inputStream,startPos);
byte[] buffer=new byte[1024];
int hasRead=0;
while(length<currentPartSize&&(hasRead=inputStream.read(buffer))>0){
currentPart.write(buffer,0,hasRead);
length+=hasRead;
}
currentPart.close();
inputStream.close();

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void skipFully(InputStream inStream,long bytes) throws IOException {
long remainning=bytes;
long len=0;
while(remainning>0){
inStream.skip(remainning);
remainning-=len;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程下载