1 import java.io.InputStream;
2 import java.io.RandomAccessFile;
3 import java.net.HttpURLConnection;
4 import java.net.URL;
5
6 public class FileDownLoader {
7
8 public void download() throws Exception {
9 String path = "http://browse.babasport.com/QQWubiSetup.exe";
10 URL url = new URL(path);
11 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
12 conn.setConnectTimeout(5*1000);
13 conn.setRequestMethod("GET");
14 conn.setRequestProperty("Accept", "image/gif, image/jpeg, " +
15 "image/pjpeg, image/pjpeg, application/x-shockwave-flash, " +
16 "application/xaml+xml, application/vnd.ms-xpsdocument, " +
17 "application/x-ms-xbap, application/x-ms-application, " +
18 "application/vnd.ms-excel, application/vnd.ms-powerpoint, " +
19 "application/msword, */*");
20 conn.setRequestProperty("Accept-Language", "zh-CN");
21 conn.setRequestProperty("Charset", "UTF-8");
22 conn.setRequestProperty("User-Agent", "Mozilla/4.0 " +
23 "(compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0;" +
24 " .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; " +
25 ".NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
26 conn.setRequestProperty("Connection", "Keep-Alive");
27 System.out.println(conn.getResponseCode());
28
29 int filesize = conn.getContentLength();//得到文件大小
30 conn.disconnect();
31 int threasize = 3;//线程数
32 int perthreadsize = filesize / 3 + 1;
33 RandomAccessFile file = new RandomAccessFile("102.wma","rw");
34 file.setLength(filesize);//设置本地文件的大小
35 file.close();
36 for(int i=0; i<threasize ; i++){
37 int startpos = i * perthreadsize;//计算每条线程的下载位置
38 RandomAccessFile perthreadfile = new RandomAccessFile("102.wma","rw");//
39 perthreadfile.seek(startpos);//从文件的什么位置开始写入数据
40 new DownladerThread(i, path, startpos, perthreadsize, perthreadfile).start();
41 }
42 //以下代码要求用户输入q才会退出测试方法,如果没有下面代码,会因为进程结束而导致进程内的下载线程被销毁
43 int quit = System.in.read();
44 while('q'!=quit){
45 Thread.sleep(2 * 1000);
46 }
47 }
48
49 private class DownladerThread extends Thread{
50 private int startpos;//从文件的什么位置开始下载
51 private int perthreadsize;//每条线程需要下载的文件大小
52 private String path;
53 private RandomAccessFile file;
54 private int threadid;
55
56 public DownladerThread(int threadid, String path, int startpos, int perthreadsize, RandomAccessFile perthreadfile) {
57 this.path = path;
58 this.startpos = startpos;
59 this.perthreadsize = perthreadsize;
60 this.file = perthreadfile;
61 this.threadid = threadid;
62 }
63
64 @Override
65 public void run() {
66 try {
67 URL url = new URL(path);
68 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
69 conn.setConnectTimeout(5 * 1000);
70 conn.setRequestMethod("GET");
71 conn.setRequestProperty("Accept", "image/gif, image/jpeg, " +
72 "image/pjpeg, image/pjpeg, application/x-shockwave-flash, " +
73 "application/xaml+xml, application/vnd.ms-xpsdocument, " +
74 "application/x-ms-xbap, application/x-ms-application, " +
75 "application/vnd.ms-excel, application/vnd.ms-powerpoint, " +
76 "application/msword, */*");
77 conn.setRequestProperty("Accept-Language", "zh-CN");
78 conn.setRequestProperty("Charset", "UTF-8");
79 conn.setRequestProperty("Range", "bytes=" + this.startpos + "-");
80 InputStream inStream = conn.getInputStream();
81 byte[] buffer = new byte[1024];
82 int len = 0;
83 int length = 0;
84 while(length<perthreadsize && (len = inStream.read(buffer))!=-1){
85 file.write(buffer, 0, len);
86 length += len;//累计该线程下载的总大小
87 }
88 file.close();
89 inStream.close();
90 System.out.println(threadid+ "线程完成下载");
91 } catch (Exception e) {
92 e.printStackTrace();
93 }
94 }
95 }
96
97 }