HttpURLConnection多线程下载

来源:互联网 发布:js追加div 编辑:程序博客网 时间:2024/05/17 19:18
package cn.itcast.net.download;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class MulThreadDownload {/** * @param args */public static void main(String[] args) {String path = "http://net.itcast.cn/QQWubiSetup.exe";try {new MulThreadDownload().download(path, 3);} catch (Exception e) {e.printStackTrace();}}/** * 从路径中获取文件名称 * @param path 下载路径 * @return */public static String getFilename(String path){return path.substring(path.lastIndexOf('/')+1);}/** * 下载文件 * @param path 下载路径 * @param threadsize 线程数 */public void download(String path, int threadsize) throws Exception{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5 * 1000);int filelength = conn.getContentLength();//获取要下载的文件的长度String filename = getFilename(path);//从路径中获取文件名称File saveFile = new File(filename);RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同accessFile.close();//计算每条线程下载的数据长度int block = filelength%threadsize==0? filelength/threadsize : filelength/threadsize+1;for(int threadid=0 ; threadid < threadsize ; threadid++){new DownloadThread(url, saveFile, block, threadid).start();}}private final class DownloadThread extends Thread{private URL url;private File saveFile;private int block;//每条线程下载的数据长度private int threadid;//线程idpublic DownloadThread(URL url, File saveFile, int block, int threadid) {this.url = url;this.saveFile = saveFile;this.block = block;this.threadid = threadid;}@Overridepublic void run() {//计算开始位置公式:线程id*每条线程下载的数据长度= ?    //计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =?int startposition = threadid * block;int endposition = (threadid + 1 ) * block - 1;try {RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");accessFile.seek(startposition);//设置从什么位置开始写入数据HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5 * 1000);conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);InputStream inStream = conn.getInputStream();byte[] buffer = new byte[1024];int len = 0;while( (len=inStream.read(buffer)) != -1 ){accessFile.write(buffer, 0, len);}inStream.close();accessFile.close();System.out.println("线程id:"+ threadid+ "下载完成");} catch (Exception e) {e.printStackTrace();}}}}

原创粉丝点击