首页 > 编程语言 >Java多线程分块下载器

Java多线程分块下载器

时间:2023-02-20 14:26:13浏览次数:35  
标签:java 分块 long Java endPos new import startPos 多线程

'''java
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MultiThreadDownloader {
private final static int BUFFER_SIZE = 4096;

public static void main(String[] args) throws IOException {
    String fileUrl = "http://www.example.com/largefile.zip";
    Path saveDir = Path.of("downloads");

    int numThreads = 4;
    long fileSize = getFileSize(fileUrl);
    List<DownloadTask> tasks = splitTasks(numThreads, fileSize);

    ExecutorService executor = Executors.newFixedThreadPool(numThreads);

    List<CompletableFuture<Void>> futures = new ArrayList<>();

    for (DownloadTask task : tasks) {
        futures.add(CompletableFuture.runAsync(() -> {
            try {
                downloadChunk(fileUrl, saveDir, task.startPos, task.endPos);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }, executor));
    }

    CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
            .thenRun(() -> {
                System.out.println("Download finished!");
                executor.shutdown();
            })
            .exceptionally(ex -> {
                System.err.println("Download failed: " + ex.getMessage());
                executor.shutdown();
                return null;
            });
}

private static void downloadChunk(String fileUrl, Path saveDir, long startPos, long endPos) throws IOException {
    HttpURLConnection connection = (HttpURLConnection) new URL(fileUrl).openConnection();
    connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
    try (InputStream input = connection.getInputStream();
         OutputStream output = new BufferedOutputStream(Files.newOutputStream(saveDir, StandardCopyOption.CREATE, StandardCopyOption.APPEND))) {

        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead;
        while ((bytesRead = input.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
        }
    }
}

private static long getFileSize(String fileUrl) throws IOException {
    HttpURLConnection connection = (HttpURLConnection) new URL(fileUrl).openConnection();
    return connection.getContentLengthLong();
}

private static List<DownloadTask> splitTasks(int numThreads, long fileSize) {
    long chunkSize = fileSize / numThreads;
    List<DownloadTask> tasks = new ArrayList<>();
    for (int i = 0; i < numThreads; i++) {
        long startPos = i * chunkSize;
        long endPos = (i == numThreads - 1) ? fileSize - 1 : (startPos + chunkSize - 1);
        tasks.add(new DownloadTask(startPos, endPos));
    }
    return tasks;
}

private static class DownloadTask {
    private final long startPos;
    private final long endPos;

    public DownloadTask(long startPos, long endPos) {
        this.startPos = startPos;
        this.endPos = endPos;
    }
}

}
'''

标签:java,分块,long,Java,endPos,new,import,startPos,多线程
From: https://www.cnblogs.com/qiantaosama/p/17137193.html

相关文章

  • C、C++、python、java
    C++和Python的区别python是一种脚本语言,是解释执行的,而C++是编译语言,是需要编译后在特定平台运行的。python可以很方便的跨平台,但是效率没有C++高。Python使用缩进来区......
  • Java流程控制
    Java流程控制Scanner对象next():一定要读取到有效字符后才可以结束输入对输入有效字符之前遇到的空白,next()方法会自动将其去掉只有输入有效字符后才能将其后面的......
  • Java基本语法
    Java基础语法注释单行注释//这是一行注释多行注释/*这是一行注释这是一行注释这是一行注释*/文档注释/***这是文档注释*这是文档注释*这是文档注......
  • Java开发词汇
    Java基础常见英语词汇(70个)OO:object-oriented,面向对象OOP:object-orientedprogramming,面向对象编程JDK:Javadevelopmentkit,java开发工具包JVM:javavirtual......
  • java 判断字符串是否为空的四种方法
    以下是java判断字符串是否为空的四种方法:方法一:最多人使用的一个方法,直观,方便,但效率很低:if(s==null||s.equals(""));方法二:比较字符串长度,效率高,是我......
  • nohup java -jar启动jar包,war包以及nohup和&的区别
    nohupjava-jara.jar>a.log2>&1&上面的命令意识: 1. nohup:不挂断地运行命令。nohangup的缩写,意即“不挂断”,注意没有后台运行功能,如果你直接在shell中用CtrlC,......
  • JAVA笔记
    基础知识数据类型面向对象......
  • Java 调用 PaddleDetection 模型
    文章地址介绍训练好的模型要给业务调用,deepjavalibrary/djl:Java中与引擎无关的深度学习框架(github.com)可以完成这件事,它支持使用Java调用PyTorch、TensorFlow、M......
  • java.sql.SQLFeatureNotSupportedException错误的解决方式
    今天在学习黑马的瑞吉外卖项目中遇到了java.sql.SQLFeatureNotSupportedException错误debug调试后发现是service进行访问数据库时未能成功连接数据库,对比过application......
  • 重拾JAVA——Linux 常见命令与环境搭建
    前言:java程序常见运行再linux系统下,所以学习linux常见命令与环境搭建也是比较重要的环节;个人因为工作原因接手java项目,需要Linux环境下部署,习惯了window下图像化操作,不要......