package com.zzw.constant; public class Contant { public static int threadCount = 3; } 1 package com.zzw.download; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.InputStreamReader; 10 import java.io.RandomAccessFile; 11 import java.net.HttpURLConnection; 12 import java.net.MalformedURLException; 13 import java.net.URL; 14 import java.net.URLConnection; 15 16 import javax.tools.FileObject; 17 18 import com.zzw.constant.Contant; 19 20 public class TestDownload 21 { 22 //public static int threadCount = 3; 23 public static int blockSize = 0; 24 25 public static void main(String[] args) throws Exception 26 { 27 URL url = new URL("http://localhost:8080/download/cc.zip"); 28 29 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 30 conn.setRequestMethod("GET"); 31 conn.setReadTimeout(10000); 32 33 long length = conn.getContentLength(); 34 35 conn.connect(); //连接 36 File file = new File("cc.zip"); 37 38 RandomAccessFile randomFile = new RandomAccessFile(file,"rwd"); 39 randomFile.setLength(length); 40 41 //每一个线程他需要下载的大小 42 System.out.println("总大小:" + length); 43 blockSize = (int) (length / Contant.threadCount); 44 System.out.println("每一个线程下载的大小:" + blockSize); 45 long start = 1; 46 long end = 0; 47 for(int i=1; i < (Contant.threadCount+1); i++) 48 { 49 50 //1 >> 0 - 46354938 123456 51 //2 >> 46354939 -(46354939 + 46354938) 52 //3 >> 53 start = blockSize * (i -1); 54 end = blockSize*i -1; 55 if(i == Contant.threadCount) 56 { 57 end = length; 58 } 59 System.out.println("第" + i + "个线程下载的区间:" + start + " - " + end); 60 new downloadThread(file, i, start, end).start(); 61 } 62 63 conn.disconnect(); 64 } 65 } 66 67 class downloadThread extends Thread 68 { 69 private File path; //本地磁盘的地址 70 private String url = "http://localhost:8080/download/cc.zip" ; //HTTP请求的地址 71 private Integer threadID; //当前是第几个线程 72 private long start; //该线程下载的起始位置 73 private long end; //该线程的结束位置 74 75 public downloadThread(File path, Integer threadID, long start, 76 long end) { 77 this.path = path; 78 this.threadID = threadID; 79 this.start = start; 80 this.end = end; 81 82 } 83 84 @Override 85 public void run() 86 { 87 try { 88 System.out.println(threadID + "开启读取"); 89 File contextFile = new File(threadID +".txt"); 90 if(!contextFile.exists()) 91 { 92 contextFile.createNewFile(); 93 } 94 95 //读取断线信息里面的数据来重新的指定从哪里开始写 96 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(contextFile))); 97 String info = reader.readLine(); 98 if(null != info && info.length() > 0) 99 { 100 start = start + Integer.parseInt(info); 101 } 102 103 System.out.println("start........=" + start); 104 URL uri = new URL(url); 105 HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); 106 conn.setRequestProperty("Range", "bytes="+start +"-" + end); 107 conn.setReadTimeout(50000); 108 conn.setConnectTimeout(50000); 109 110 conn.connect(); 111 112 //让http请求只请求一个片段 113 System.out.println("bytes="+start +"-" + end); 114 115 //判断一下是否为200? 116 int status = conn.getResponseCode(); 117 118 if(status / 100 == 2) 119 { 120 int total = 0; //总共下载的字节数 121 //FileOutputStream out = new FileOutputStream(new File(threadID +".txt")); 不靠谱了 122 RandomAccessFile random = new RandomAccessFile(path, "rw"); 123 124 random.seek(start); 125 InputStream in = conn.getInputStream(); 126 byte[] buffer = new byte[1024]; 127 int len = 0; 128 129 while((len = in.read(buffer)) != -1) 130 { 131 RandomAccessFile duandian = new RandomAccessFile(contextFile, "rwd"); 132 random.write(buffer, 0, len); 133 total += len; 134 duandian.write(String.valueOf(total).getBytes()); 135 duandian.close(); 136 } 137 in.close(); 138 random.close(); 139 } 140 conn.disconnect(); 141 System.out.println(threadID + "读取完成"); 142 } catch (MalformedURLException e) { 143 e.printStackTrace(); 144 } catch (IOException e) { 145 e.printStackTrace(); 146 }finally 147 { 148 synchronized (TestDownload.class) 149 { 150 Contant.threadCount --; 151 System.out.println("Contant.threadCount = " + Contant.threadCount); 152 if(Contant.threadCount == 0) 153 { 154 for(int i=1; i < 4; i++) 155 { 156 File contextFile = new File(i +".txt"); 157 System.out.println(contextFile.delete() +" ccc"); 158 } 159 } 160 } 161 } 162 163 } 164 }