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; } } }
使用HttpUrlConnection多线程下载文件
最新推荐文章于 2020-04-03 19:53:31 发布