IO流结合线程池下载远程网络文件

package com.zmc.io.demo;

import com.zmc.io.util.TimeUtils;

import java.io.*;
import java.net.*;
import java.text.DecimalFormat;
import java.util.UUID;
import java.util.concurrent.*;

public class FileSteamBufferDemo1 {
    /**
     * @param diskPath 本地磁盘路径
     * @param httpUrl  远程网络文件地址
     */
    public static void downLoadFromUrl(String diskPath, String httpUrl) {
        int start = Integer.parseInt(TimeUtils.currTimeMs());
        String path = "E:" + diskPath;
        File file = new File(path);
        boolean mkFlag = true;
        /*如果文件夹不存在则创建*/
        if (!file.isDirectory()) {
            mkFlag = file.mkdirs();
        }
        if (mkFlag) {
            /*文件夹创建成功之后,获取文件夹绝对路径*/
            path = file.getAbsolutePath();
        } else {
            System.err.println("文件夹创建失败!");
            return;
        }
        InputStream inputStream = null;
        BufferedInputStream bufferedInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            URL url = new URL(httpUrl);
            /*文件后缀*/
            String fileSuffix = url.getPath().substring(url.getPath().lastIndexOf("."));
            URLConnection urlConnection = url.openConnection();
            /*超时时间*/
            urlConnection.setConnectTimeout(10 * 1000);
            /*文件字节大小*/
            float byteLength = urlConnection.getContentLength();
            /*inputStream=urlConnection.getInputStream();*///两种方式
            inputStream = url.openStream();
            bufferedInputStream = new BufferedInputStream(inputStream);
            /*文件夹路径+分隔符+文件名.后缀*/
            fileOutputStream = new FileOutputStream(path + File.separator + UUID.randomUUID() + fileSuffix);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            double len;
            double v = 0;
            byte[] bytes = new byte[1024];
            /*格式化数字*/
            DecimalFormat format = new DecimalFormat("#.###");
            while ((len = bufferedInputStream.read(bytes)) != -1) {
                bufferedOutputStream.write(bytes, 0, (int) len);
                bufferedOutputStream.flush();
                v = v + len;
                System.out.println("下载进度:" + format.format(v / byteLength * 100) + "%" + "-----" + Thread.currentThread().getName());
            }
            int end = Integer.parseInt(TimeUtils.currTimeMs());
            System.out.println(Thread.currentThread().getName() + "success!耗时:" + (end - start) + "毫秒");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
                if (bufferedOutputStream != null) {
                    bufferedOutputStream.close();
                }
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    /**
     * 线程池内部工具类
     */
    static class TreadPoolUtils {
        private static final int CORE_POOL_SIZE = 5;
        private static final int MAX_POOL_SIZE = 10;
        private static final int QUEUE_CAPACITY = 100;
        private static final Long KEEP_ALIVE_TIME = 6L;

        public TreadPoolUtils() {
        }
        public static Executor executor() {
            ThreadPoolExecutor executor = new ThreadPoolExecutor(
                    CORE_POOL_SIZE,
                    MAX_POOL_SIZE,
                    KEEP_ALIVE_TIME,
                    TimeUnit.SECONDS,
                    new ArrayBlockingQueue<>(QUEUE_CAPACITY),
                    new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }
    }
    public static void main(String[] args) {
        Executor executor = TreadPoolUtils.executor();
        for (int i = 1; i <= 3; i++) {
            executor.execute(() -> {
                /*拼接出本地磁盘地址*/
                String diskPath = "/baosight/" + UUID.randomUUID().toString().replace("-", "");
                /*qq音乐下载地址*/
                String url = "https://c219154334b88393b0583619207b5908.rdt.tfogc.com:49156/dldir1.qq.com/" +
                        "music/clntupate/QQMusicSetup.exe?mkey=6389d829b8daecdf6028b7fc751df986&arrive_key" +
                        "=129003220&cip=101.228.208.232&proto=https";

                downLoadFromUrl(diskPath, url);
            });
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值