题目
下载地址: String path = "http://softforspeed.51xiazai.cn/down/BaiduNetdisk_6.9.7.4.exe";
迅雷的下载 获取 百度网盘的下载. 都会先在硬盘路径中 产生1个 , 同名 ,同大小的文件 .
下载线程类
package com.cpd.test.taick_download;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/**
* 作用: 执行下载的 线程
*
*/
public class DownLoadThread extends Thread{
//需要 下载的开始位置 ,结束位置 , 线程编号
private int startIndex;
private int endIndex;
private int threadId;
//通过构造 初始化成员变量
public DownLoadThread(int startIndex, int endIndex, int threadId) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.threadId = threadId;
}
@Override
//描述了 多线程的 下载逻辑
public void run() {
try {
URL url = new URL(MultiThreadTest.path); //接收网络下载路径
//打开网络链接 ,因为是http请求 ,需要返回HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求网络的必要参数
conn.setConnectTimeout(5000); //连接超时
conn.setReadTimeout(500); //读取超时
conn.setRequestMethod("GET"); //设置请求方法为get请求
//设置 请求范围的参数 Range :范围
conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);
//需要执行 以及成功获取到了网络链接
if(conn.getResponseCode()==206){
//只要 链接成功 ,conn 就已经包含了服务器返回的数据
InputStream is = conn.getInputStream();
//该文件用于 存放 ,写入的数据 (可以理解为 临时文件 ,和被下载文件大小一致 )
File file = new File("BaiduNetdisk_6.9.7.4.exe");
//RandomAccessFile 支持 随机 读写
RandomAccessFile raf = new RandomAccessFile(file,"rwd");
raf.seek(startIndex); //跳到到 读取位置
System.out.println("线程:"+threadId+"下载开头位置:"+startIndex+"---"+"下载结束位置:"+endIndex);
//开始拷贝了
byte[] buf = new byte[1024];
int len =0;
while((len=is.read(buf))!=-1){
raf.write(buf,0,len);
}
//一共有3个线程 ,对应 3个 完毕信息
System.out.println("线程:"+threadId+" 下载完毕了...");
raf.close();
MultiThreadTest.finishedThead++;
//最后为解决多线程并发
synchronized (MultiThreadTest.path){
MultiThreadTest.finishedThead=0; //如果都下载完毕 ,都 赋值为0
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码实现
package com.cpd.test.taick_download;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 测试下载
*/
public class MultiThreadTest {
static String path = "http://softforspeed.51xiazai.cn/down/BaiduNetdisk_6.9.7.4.exe";
//static String path = "https://download.jetbrains.8686c.com/idea/ideaIU-2020.1.3.exe";
static int finishedThead = 0; //下载完毕的线程
static int threadCount =3;//3个线程
public static void main(String[] args) throws IOException {
/**
* 分析:
* 不知道文件的总大小 ,也不知道 每个线程分配的下载开始和结束位置的大小
*/
URL url = new URL(MultiThreadTest.path); //接收网络下载路径
//打开网络链接 ,因为是http请求 ,需要返回HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求网络的必要参数
conn.setConnectTimeout(5000); //连接超时
conn.setReadTimeout(500); //读取超时
conn.setRequestMethod("GET"); //设置请求方法为get请求
// 服务器常见响应码
// 500: 服务器内部错误
// 404: 找不到路径
// 200: 成功
// 206: 也是成功 ,是部分数据获取成功
//如果链接成功
if(conn.getResponseCode()==200){
//获取到文件总长
int contentLength = conn.getContentLength();
int size = contentLength/threadCount; //每个线程下载的大小
//开启循环下载
for (int i = 0; i < threadCount; i++) {
int startIndex = i*size; //线程开头位置
int endIndex = (i+1)*size;
DownLoadThread td = new DownLoadThread(startIndex,endIndex,i);
td.start(); //开启线程
}
}
}
}
效果
注:默认下载到当前工程的src下