package com.eboy.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class DownloadThread { /** * @param args */ public static void main(String[] args) throws Exception { String path = "http://dl_dir.qq.com/invc/cyclone/QQDownload_Setup_39_716_p1.exe"; new DownloadThread().download(path, 5); } /** * 下载文件 * @param path网络文件路径 */ private void download(String path, int ThreadSize) throws Exception{ // TODO Auto-generated method stub URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if (conn.getResponseCode() == 200){ int length = conn.getContentLength(); //获得网络文件长度 File file = new File(getFileName(path)); RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.setLength(length); accessFile.close(); //计算每条线程下载的数据量 int block = length % ThreadSize == 0 ? length / ThreadSize : length / ThreadSize + 1; for (int ThreadID=0; ThreadID < ThreadSize; ThreadID++){ new DownloadFileThread(ThreadID, block, url, file).start(); } }else{ System.out.println("下载失败。"); } } private class DownloadFileThread extends Thread{ private int ThreadID; private int Block; private URL url; private File file; public DownloadFileThread(int ThreadID, int block, URL url, File file){ this.ThreadID = ThreadID; this.Block = block; this.url = url; this.file = file; } public void run() { int Start = this.ThreadID * this.Block; int End = (this.ThreadID + 1) * this.Block - 1; try { RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.seek(Start); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); conn.setRequestProperty("Range", "bytes=" + Start + "-" + End); if (conn.getResponseCode() == 206){ InputStream inputStream = conn.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1){ accessFile.write(buffer, 0, len); } accessFile.close(); inputStream.close(); } System.out.println(ThreadID + 1 + " start: " + Start + " end: " + End + " 线程下载完成成。"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } private String getFileName(String path) { // TODO Auto-generated method stub return path.substring(path.lastIndexOf("/") + 1); } }
转载于:https://www.cnblogs.com/jxgxy1/archive/2012/07/11/2587250.html