多线程下载

代码:

package com.demo.servlet.filedownload;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;


/**
 * 多线程下载同一个文件
 */
public class MultiThreadDown {
public MultiThreadDown() throws Exception {
String fileDownName = "jetty.zip";
//声明url
String path = "http://localhost:8080/tianpengfei/up/" + fileDownName;
//第一步:声明url对象
URL url = new URL(path);
//第二步:返回连接对象
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//第三步:设置请求类型
con.setRequestMethod("GET");
//第四步接收信息
con.setDoInput(true);
//第五步:连接
con.connect();
//6:状态码
int code = con.getResponseCode();
if(code==200){
//7:数据的长度
int sum = con.getContentLength();
System.err.println("总文件的大小:"+sum);
//7.1有了文件的长度,直接创建一个相同大小的文件
String fileName = "d:/a/" + fileDownName;
RandomAccessFile file = new RandomAccessFile(new File(fileName),"rw");
file.setLength(sum);
file.close();
//8:声明线程的个数
int threadCount = 3;
//9:计算每个线程的下载量
int threadSize = sum/threadCount +(sum%threadCount==0?0:1);
System.err.println("每个线程下载的数据量:"+threadSize);
//10:计算每个线程下载的数据量
for(int i=0;i<threadCount;i++){
int start =i*threadSize;
int end = start+(threadSize-1);
//这个是主线程,但是主线程并没有参与下载
System.out.println(Thread.currentThread().getName()+" 线程应该下载的是:bytes="+start+"-"+end);
System.err.println("第"+(i+1)+"个线程应该下载的是:bytes="+start+"-"+end);
//启动多个线程
new MyDownThread(url,fileName,start,end).start();
}

}
con.disconnect();
}
public static void main(String[] args) throws Exception {
new MultiThreadDown();
}
}
/**
 * 所有线程要知
 * 道url地址
 * 写哪一个文件
 * 从哪儿开始写
 * 一共多少字节,数据
 */
class MyDownThread extends Thread{
private URL url;
private String fileName;
private int start;
private int end;
public MyDownThread(URL url, String fileName, int start, int end) {
this.url = url;
this.fileName = fileName;
this.start = start;
this.end = end;
}
@Override
public void run() {
try{
//打开连接
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//设置
con.setRequestMethod("GET");
con.setDoInput(true);
//设置从哪儿开始下载数据
con.setRequestProperty("range","bytes="+start+"-"+end);
con.connect();
int code = con.getResponseCode();
if(code==206){
int size = con.getContentLength();
System.err.println("线程:"+this.getName()+",下载的数据量为:"+size);
InputStream in = con.getInputStream();
//写同一文件
RandomAccessFile file = new RandomAccessFile(new File(fileName),"rw");
//设置从文件的什么位置开始写数据
file.seek(start);
//读取数据
byte[] b = new byte[1024];
int len = 0;
while((len=in.read(b))!=-1){
file.write(b,0,len);
}
file.close();
}
con.disconnect();
}catch(Exception e){
e.printStackTrace();
}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值