多线程文件下载 - 数组切分,截取文件名称

java 复制代码
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestThread2 extends Thread {
    private List<String> urlList;

    public TestThread2() {
    }

    public TestThread2(List<String> urlList) {
        this.urlList = urlList;
    }

    @Override
    public void run() {
        WebDownLoader webDownLoader = new WebDownLoader();
        urlList.forEach(x -> {
            try {
                System.out.println(Thread.currentThread().getName() + "执行");
                webDownLoader.downloader(x);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList("https://pic.xxxxx-cdn.com//1/130702.jpg",
"https://pic.xxxxx-cdn.com//1/106152.jpg",
"https://pic.xxxxx-cdn.com//1/100603.jpg",
"https://pic.xxxxx-cdn.com//1/98446.jpg",
"https://pic.xxxxx-cdn.com//1/98436.jpg",
"https://pic.xxxxx-cdn.com//1/98411.jpg",
"https://pic.xxxxx-cdn.com//1/98176.jpg",
"https://pic.xxxxx-cdn.com//1/98072.jpg");
        //切分数组
        List<List<String>> lists = splitList(list, 3);
        lists.forEach(x -> {
            TestThread2 td = new TestThread2(x);
            td.start();
        });

    }

    /**
     * @param list    数组
     * @param partNum 切分次数
     * @return 先按平均值切分,最后一次全部
     */
    private static List<List<String>> splitList(List<String> list, int partNum) {
        List<List<String>> rList = new ArrayList<>();
        int avgNum = list.size() / partNum;
        System.out.println(avgNum + ":平均数");

        for (int part = 0; part < partNum; part++) {
            //判断start起始位置 0 : avgNum * part
            int start = 0 == part ? 0 : avgNum * part;
            //判断最后一次结束位置 list.size() : start + avgNum
            int end = partNum == part + 1 ? list.size() : start + avgNum;
            System.out.println(String.format("第%s次,起始:%s 位置:%s", part + 1, start, end));
            List<String> subList = new ArrayList<>();
            for (int i = start; i < end; i++) {
//                System.out.println(list.get(i));
                subList.add(list.get(i));
            }
            rList.add(subList);
        }
        System.out.println(rList);
        return rList;
    }
}

class WebDownLoader {
    public void downloader(String url) throws IOException {
class WebDownLoader {
    public void downloader(String url) throws IOException {
        // 提取文件名
        String fileName = url.substring(url.lastIndexOf('/') + 1); // "filename.txt"
        // 提取名称部分(例如去掉扩展名)
        String name = fileName.substring(0, fileName.lastIndexOf('.')); // "filename"
        FileUtils.copyURLToFile(new URL(url), new File(fileName));
    }
}
        FileUtils.copyURLToFile(new URL(url), new File(fileName));
    }
}
相关推荐
古法安卓4 小时前
Android-日志系统源码解析
android·java·android studio
小夏coding5 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng6 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛8 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko8 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户31268748772011 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang11 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing11 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活12 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg13 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售