Giter VIP home page Giter VIP logo

down-bit's Introduction

down-bit's People

Contributors

niumoo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

down-bit's Issues

getUrlConnection获取inputStream报416错误

public static HttpURLConnection getHttpUrlConnection(String url, long start, Long end) throws IOException {
    HttpURLConnection httpUrlConnection = getHttpUrlConnection(url);
    if (end != null) {
        httpUrlConnection.setRequestProperty("RANGE", "bytes=" + start + "-" + end);
    } else {
        httpUrlConnection.setRequestProperty("RANGE", "bytes=" + start + "-");
    }
    return httpUrlConnection;
}

该方法中的有end范围增加 ”/*“之后会发生错误,在获取inputStream的时候会报416错误,在qq/微信的下载链接中均会报错

日志工具类,是否支持2个及以上文件同时断点续传呢.

`public class LogThread implements Callable {

public static AtomicLong LOCAL_FINISH_SIZE = new AtomicLong();
public static AtomicLong DOWNLOAD_SIZE = new AtomicLong();
public static AtomicLong DOWNLOAD_FINISH_THREAD = new AtomicLong();
private long httpFileContentLength;

public LogThread(long httpFileContentLength) {
    this.httpFileContentLength = httpFileContentLength;
}

@Override
public Boolean call() throws Exception {
    int[] downSizeArr = new int[5];
    int i = 0;
    double size = 0;
    double mb = 1024d * 1024d;
    // 文件总大小
    String httpFileSize = String.format("%.2f", httpFileContentLength / mb);
    while (DOWNLOAD_FINISH_THREAD.get() != DownloadMain.DOWNLOAD_THREAD_NUM) {
        double downloadSize = DOWNLOAD_SIZE.get();
        downSizeArr[++i % 5] = Double.valueOf(downloadSize - size).intValue();
        size = downloadSize;

        // 每秒速度
        double fiveSecDownloadSize = Arrays.stream(downSizeArr).sum();
        int speed = (int)((fiveSecDownloadSize / 1024d) / (i < 5d ? i : 5d));

        // 剩余时间
        double surplusSize = httpFileContentLength - downloadSize - LOCAL_FINISH_SIZE.get();
        String surplusTime = String.format("%.1f", surplusSize / 1024d / speed);
        if (surplusTime.equals("Infinity")) {
            surplusTime = "-";
        }

        // 已下大小
        String currentFileSize = String.format("%.2f", downloadSize / mb + LOCAL_FINISH_SIZE.get() / mb);
        String speedLog = String.format("> 已下载 %smb/%smb,速度 %skb/s,剩余时间 %ss", currentFileSize, httpFileSize, speed, surplusTime);
        System.out.print("\r");
        System.out.print(speedLog);
        Thread.sleep(1000);
    }
    System.out.println();
    return true;
}

}`

本人多线程经验不是特别丰富.这类将一些成员变量记录为静态的,如果2个文件都在进行断点续传下载,这个变量(LOCAL_FINISH_SIZE)是否会被设置2次

稍微改进了下代码

首先对up主的代码表达敬意,然后我自己小改了下,实现针对特别小的文件下载也支持。修改DownloadMain的splitDownload()方法:

/**
     * 切分下载任务到多个线程
     *
     * @param url
     * @param futureList
     * @throws IOException
     */
    public void splitDownload(String url, List<Future<Boolean>> futureList) throws IOException {
        long httpFileContentLength = HttpUtls.getHttpFileContentLength(url);
        // 任务切分
        long size = httpFileContentLength / DOWNLOAD_THREAD_NUM;
        long lastSize = httpFileContentLength - (size * (DOWNLOAD_THREAD_NUM - 1));

        /**
         * 针对超小的文件,仅启动一个线程来下载
         */
        if (size == 0){
            DOWNLOAD_THREAD_NUM = 1;
            ExecutorService executor = Executors.newFixedThreadPool(DOWNLOAD_THREAD_NUM + 1);
            DownloadThread downloadThread = new DownloadThread(url, 0, lastSize, 0, httpFileContentLength);
            Future<Boolean> future = executor.submit(downloadThread);
            futureList.add(future);
        }else {
            for (int i = 0; i < DOWNLOAD_THREAD_NUM; i++) {
                long start = i * size;
                Long downloadWindow = (i == DOWNLOAD_THREAD_NUM - 1) ? lastSize : size;
                Long end = start + downloadWindow;
                if (start != 0) {
                    start++;
                }
                DownloadThread downloadThread = new DownloadThread(url, start, end, i, httpFileContentLength);
                Future<Boolean> future = executor.submit(downloadThread);
                futureList.add(future);
            }
        }


    }

关于项目中getCRC32函数和getHttpFileEtag函数的问题

您好,我最近想要学习下多线程断点续传的相关内容,看到您写的这个小项目,感觉特别棒
项目中DownloadMain.java中的函数getCRC32和HttpUtils.java中的函数getHttpFileEtag貌似并没有被使用
通过阅读您的微信文章和查阅网上资料,了解到这两个函数应该是用于对下载的临时文件进行校验的,但项目中没有引用是否说明在下载完成每段临时文件后没有校验呢?
我的想法是直接声明一个变量存储第一段临时文件的Etag,当下一段临时文件下载完成后,如果它的Etag和前一个Etag不同,就说明发生了改变,下载失败,提示信息并删除已下载的临时文件。不知道这样编写代码可否?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.