package com.test; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; public class DownLoadUtil { private String urlStr; private String targetFile; private int threadNum; private DownloadThread[] threads; private int fileSize; public DownLoadUtil(String urlStr, String targetFile, int threadNum) { this.urlStr = urlStr; this.targetFile = targetFile; this.threadNum = threadNum; this.threads = new DownloadThread[threadNum]; } public void download() { try { HttpURLConnection conn = this.getHttpURLConnection(); conn.setRequestProperty("Connection", "Keep-Alive"); fileSize = conn.getContentLength(); conn.disconnect(); int currentPartSize = fileSize/threadNum + 1; RandomAccessFile file = new RandomAccessFile(targetFile, "rw"); file.setLength(fileSize); file.close(); for(int i=0; i<threadNum; i++) { int startPosition = currentPartSize * i; RandomAccessFile currentFile = new RandomAccessFile(targetFile, "rw"); currentFile.seek(startPosition); threads[i] = new DownloadThread(startPosition, currentFile, currentPartSize); new Thread(threads[i]).start(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private class DownloadThread implements Runnable { private int startPosition; private RandomAccessFile downloadFile; private int currentPartSize; private int hasDownSize; public DownloadThread(int startPosition, RandomAccessFile downloadFile, int currentPartSize) { this.startPosition = startPosition; this.downloadFile = downloadFile; this.currentPartSize = currentPartSize; } @Override public void run() { try { HttpURLConnection conn = getHttpURLConnection(); InputStream in = conn.getInputStream(); in.skip(this.startPosition); byte[] buffer = new byte[1024]; int hasRead = 0; while (hasDownSize < currentPartSize && (hasRead = in.read(buffer)) != -1) { downloadFile.write(buffer, 0, hasRead); hasDownSize += hasRead; } downloadFile.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } } private HttpURLConnection getHttpURLConnection() { HttpURLConnection conn = null; try { URL url = new URL(urlStr); 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("Accept-Language", "zh-CN"); conn.setRequestProperty("Charset", "UTF-8"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return conn; } }