java实现断点续传

   之前搞过一个java实现的一个多线程端点续传,在网上查了很多资料,感觉大多数都已经基本实现了基本功能。大体思路先搞一个全局变量初始值为0。就是启动一个主线程并计算要下载的资源的大小,并分成多个线程(每个线程的大小也就是已知的全局编,默认为3个吧),然后每个线程分别工作:发送请求包,并设置包头信息Range,制定请求资源的范围,然后进行下载(方便断点续传)。同时再生成记录各个线程下载的大小,这样即使断电的话,也会知道此时下载的状态,也就是是实现了断点续传的功能。如果记载的大小要请求文件的大小相等,那么子线程结束,并全局变量自增1,当全局变量等于3的时候,删除记录下载状态的临时文件。

   但是这里出现了一个问题:假如说现在是三个线程进行下载任务,一个线程已经完成,另外两个未完成,那么全局变量永远都不会等于3,也就是说程序永远都不会结束。

   所以改进一下:在增加生成一个临时文件,用于记录三个线程的完成个数,由于已经实体化了,所以也就不怕断电了。在搞一个定时器,定时检查那个文件是不是等于3,如果等于三的话,删除临时文件。

   程序测试的时候感觉即使是多线程下载,不过速度也没快到那里去啊,还是跟带宽有直接的联系啊。

   代码如下:由于考虑https的资源请求,我做了相关的处理,代码也没有进行整理,所以显得十分混乱。不过也无所谓了。。。。。。。。。。。。。

public class MultiDownload {
private static  ReadWriteLock lock = new ReentrantReadWriteLock();
private  int threadCount = 3; // 线程总数
String filePath = null;


/**
* 下载方法
*/

public  boolean download(String urlStr, String filePath) {
this.filePath = filePath;
String URL = urlStr;
try {
File dir = new File(filePath+"total"+File.separator);
if(!dir.exists()){ //文件目录不存在则创建
lock.readLock().lock();
try{
dir.mkdirs();
}finally{
lock.readLock().unlock();
}
}
File finishedThreadTXT = new File(new File(filePath + "total") + File.separator+"finishedThread.txt");

new timer(finishedThreadTXT).start();
URL url = new URL(URL);
if((urlStr.toLowerCase().trim()).startsWith("https")){
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000000);
conn.setHostnameVerifier(new HostnameVerifier() {

public boolean verify(String hostname, SSLSession session) {
// TODO Auto-generated method stub
return true;
}
});
int responseCode = conn.getResponseCode();
if(responseCode == 200){
long length = conn.getContentLength(); // 拿到所请求资源文件的长度
File file = new File(filePath);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.setLength(length); // 设置文件大小
raf.close();
long blocksize = length / threadCount; // 计算每个子线程应该下载的大小
for(int i = 0; i < threadCount; i++) {
long startIndex = i * blocksize;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值