百度云限速如此恶心为何不自己做个下载器(新手向)

各位非常抱歉,成了标题党,我只是一个初学者,这只是一个URL的练手demo

一、架构(伪)

我知道我现在写的这个框架很烂所以就写个(伪)
在这里插入图片描述

二、代码实现

DownloadOperation类

	import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

/**
 * @Description:一个文件的下载
 * @Author:Zc9741
 * @QQ:516906531
 */
public class DownloadOperation {
    private URL url;
    private String filePath;
    private int threadCount;
    //private DownloadThread[] task;
    private long size;
    public static long downloaded;

    public DownloadOperation(String urlString,String filePath, int threadCount) {
        try {
            this.url=new URL(urlString);
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.filePath = filePath;
        this.threadCount = threadCount;
        //task=new DownloadThread[threadCount];
    }

    public void download(){
        //获取文件的大小
       getFileSize();
       //System.out.println(size);

        //创建文件 用于保存下载的数据
        creatfile();

        //分配线程下载数据
        dispatch();
    }

    private void dispatch() {
        //计算每个线程下载的平均大小
        long average=size/threadCount;

        //每个线程下载的位置
        long start=0;
        long downloadSize =average;

        for (int i = 0; i < threadCount; i++) {
            start=i*average;

            //最后一个线程下载的更多
            if(i==threadCount-1){
                downloadSize=size-start;
            }
            //创建线程 执行对应的模块进行下载
            DownloadThread dt=new DownloadThread(url,filePath,start,downloadSize);
            //保存线程对象
            //task[i]=dt;

            // 启动下载
            dt.start();
        }


    }
    //获取进度条
    public float currentRate(){
        long len=0;
        len=downloaded;
        return (float)len/size;
    }
    private void creatfile() {
        File file=new File(filePath);
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置文件大小
        RandomAccessFile rac=null;
        try {
            rac=new RandomAccessFile(file,"rw");
            rac.setLength(size);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                rac.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void getFileSize(){
        //url
        //获取链接
        HttpURLConnection conn=null;
        try {
            conn= (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("HEAD");
            //获取资源大小
            size = conn.getContentLengthLong();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            conn.disconnect();
        }

    }
}

DownloadThread类

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @Description:
 * @Author:Zc9741
 * @QQ:516906531
 */
public class DownloadThread extends Thread {
    private URL url;
    private String filePatgh;
    private long startPosition;
    private long downloadsize;
    private long downloadedLength;


    public DownloadThread(URL url, String filePatgh, long startPosition, long downloadsize) {
        this.url = url;
        this.filePatgh = filePatgh;
        this.startPosition = startPosition;
        this.downloadsize = downloadsize;
    }

    @Override
    public void run() {
        //定位到这个线程应该写入的位置
        try {
            RandomAccessFile raf=new RandomAccessFile(filePatgh,"rw");
            raf.seek(startPosition);

            //开始下载
            HttpURLConnection conn= (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.setConnectTimeout(5000);

            //获取输入流
            InputStream is = url.openStream();
            //设置数据读取位置
            is.skip(startPosition);//调到该线程负责的文件位置

            //开始读取数据  写入到文件
            byte[] buffer = new byte[1024];
            int len=0;
            while ((len=is.read(buffer))!=-1){
                raf.write(buffer,0,len);

                //记录当前下载的长度
                downloadedLength =len+downloadedLength;
                DownloadOperation.downloaded += len;

                //判断当前线程下载的范围是否结束
                if(downloadedLength>=downloadsize){
                    break;
                }
            }

            is.close();
            conn.disconnect();
            raf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

DownloadManager类

import java.util.Map;

/**
 * @Description:
 * @Author:Zc9741
 * @QQ:516906531
 */
public class DownloadManager {
    private Map<String,String>[] source;
    private static DownloadManager manager;
    private DownloadManager(){}

    //单例设计模式
    public  static DownloadManager getManager(){
        if(manager==null){
            synchronized (DownloadManager.class){
                if(manager==null){
                    manager=new DownloadManager();
                }
            }
        }
        return manager;
    }

    //下载一个文件  (重载)
    public void loadDate(String urlString,String filePath){
        DownloadOperation downloader=new DownloadOperation(urlString,filePath,3);
        downloader.download();


        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    float rate = downloader.currentRate();
                    if(rate>=0.99){
                        System.out.println("当前下载进度:100.00%");
                        System.out.println("下载完成");
                       break;
                    }else{
                        String format = String.format("%.2f", rate*100);
                        System.out.println("当前下载进度:"+format+"%");
                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }

            }
        }).start();
    }

    //下载多个文件
    public void loadDate(Map<String,String>[] datas){

    }
}

MyClass类

public class MyClass {
    public static void main(String[] args) {
        String url="http://localhost/upLoad/video/(demo)通讯录代码实现.mp4";
        String filePath="D:\\Users\\Desktop\\TestFile\\interview.mp4";
        DownloadManager manager = DownloadManager.getManager();
        manager.loadDate(url,filePath);
    }
}

三、测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值