1、多线程下载工具类

import java.net.URL;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;public class DownUtil {//定义下载路径private String path;//指定所下载的文件的保存位置private String targetFile;//定义下载线程的数量private int threadNum;//定义下载线程的对象private DownThread[] threads;//下载文件的总大小private int fileSize;public DownUtil(String path,String targetFile,int threadNum){this.path = path;this.targetFile = targetFile;this.threadNum = threadNum;threads = new DownThread[threadNum];this.targetFile = targetFile;}public void downLoad() throws Exception{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(5 * 1000);//设置 URL 请求的方法, GET POST HEAD OPTIONS PUT DELETE TRACE 以上方法之一是合法的,具体取决于协议的限制。conn.setRequestMethod("GET");//设置一般请求属性。如果已存在具有该关键字的属性,则用新值改写其值。 conn.setRequestProperty("Accpt", "image/gif,image/jpeg,image/pjpeg,image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, "+ "application/vnd.ms-xpsdocument, application/x-ms-xbap"+ "application/x-ms-application,application/vnd.ms-excel"+ "application/vnd.ms-powerpoint, application/msword,*/*");conn.setRequestProperty("Accept-Language", "zh_CN");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Connection", "Keep-Alive");//得到文件大小fileSize = conn.getContentLength();conn.disconnect();int currentPartSize = fileSize / threadNum + 1;RandomAccessFile file = new RandomAccessFile(targetFile,"rw");//设置本地文件大小file.setLength(fileSize);file.close();for(int i = 0;i < threadNum;i++){//计算每个线程的下载位置int startPos = i * currentPartSize;//每个线程使用一个RandomAccessFile进行下载RandomAccessFile currentPart = new RandomAccessFile(targetFile,"rw");//定位该线程的下载位置currentPart.seek(startPos);//创建下载线程threads[i] = new DownThread(startPos, currentPartSize, currentPart);threads[i].start();}}public double getCompleteRate(){int sumSize = 0;for(int i = 0;i < threadNum;i++){sumSize += threads[i].length;}return sumSize * 1.0 / fileSize;}private class DownThread extends Thread{//当前线程的下载位置private int startPos;//定义当前线程负责下载的文件大小private int currentPartSize;//当前线程需要下载的文件块,此类的实例支持对随机访问文件的读取和写入。private RandomAccessFile currentPart;//定义该线程已下载的字节数public int length;private DownThread(int startPos,int currentPartSize,RandomAccessFile currentPart){this.startPos = startPos;this.currentPartSize = currentPartSize;this.currentPart = currentPart;}public void run(){try{URL url = new URL(path);//url.openConnection():返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(5 * 1000);conn.setRequestMethod("GET");conn.setRequestProperty("Accpt", "image/gif,image/jpeg,image/pjpeg,image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, "+ "application/vnd.ms-xpsdocument, application/x-ms-xbap"+ "application/x-ms-application,application/vnd.ms-excel"+ "application/vnd.ms-powerpoint, application/msword,*/*");conn.setRequestProperty("Accept-Language", "zh_CN");conn.setRequestProperty("Charset", "UTF-8");InputStream inputStream = conn.getInputStream();//inputStream.skip(n);跳过和丢弃此输入流中数据的 n 个字节inputStream.skip(this.startPos); byte[] buffer = new byte[1024];int hasRead = 0;//读取网络数据写入本地while(length < currentPartSize && (hasRead = inputStream.read(buffer)) != -1){currentPart.write(buffer, 0, hasRead);length += hasRead;}currentPart.close();inputStream.close();}catch(Exception e){e.printStackTrace();}}}
}

2、主程序

package charpter1;public class MultiThreadDown {   public static void main(String[] args) throws Exception {final DownUtil downUtil = new DownUtil("https://ss0.baidu.com/"+ "6ONWsjip0QIZ8tyhnq/it/u=1927822194,1885130936&fm=80&w=179&h=119&img.JPEG","11.JPEG",4);downUtil.downLoad();new Thread(() -> {while(downUtil.getCompleteRate() < 1){System.out.println("已完成: "+ downUtil.getCompleteRate());try{//每隔0.1秒查询一次任务Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}System.out.println("已完成: "+ downUtil.getCompleteRate());}).start();}
}

3、下载的图片:

Java之多线程下载工具类相关推荐

  1. java 下载txt文件(页面代码+Java后台代码+下载工具类)

    需求:页面有一个下载按钮,当点击下载的时候将页面表单数据下载到成为txt文件,并在网页直接下载该文件 1.页面(html) 下载一定要通过form表单的方式,js的ajax函数的返回类型只有xml.t ...

  2. Java调用linux指令工具类,直接执行cmd,执行grep指令返回结果,执行sed追加指令,hdfs下载指令,获取文件行数

    Java调用linux指令工具类,直接执行cmd,执行grep指令返回结果,执行sed追加指令,hdfs下载指令,获取文件行数 问题背景 LinuxUtils工具类 Lyric:梦想挟带眼泪 问题背景 ...

  3. JAVA 文件上传下载工具类

    JAVA 文件上传下载工具类 import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org. ...

  4. java ftp ftpclient_详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClie ...

  5. JAVA 实现多线程下载大文件

    JAVA 实现多线程下载大文件 开发中遇到一个问题,下载大文件到本地,导致等待时间过长,然后就寻找一个可以多线程下载的办法,受下载软件启发,想到多线程下载, 原理,首先查到这个文件的大小,然后根据线程 ...

  6. 华为云OBS文件上传下载工具类

    Java-华为云OBS文件上传下载工具类 文章目录 Java-华为云OBS文件上传下载工具类 1.华为云obs文件上传下载 2.文件流转MultipartFile 3.File转换为Multipart ...

  7. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  8. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  9. java项目常用的工具类

    前言 在开发过程中,我们会遇到很多繁琐或者棘手的问题,但是,这些问题往往会存在一些便捷的工具类,来简化我们的开发,下面是我工作中经常使用到的工具类 常用工具类 日期工具类 import java.te ...

最新文章

  1. ssh tunnel 上网
  2. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
  3. python怎么导入csv文件-python读取CSV文件
  4. java实现多线程的4种方式
  5. 迅雷影音怎样 1.5倍速度播放
  6. 除了敲代码,程序员还能有什么副业?
  7. mysql网络异常_网络连接配置出现异常_网络连接配置无法修复_Mysql网络连接的性能配置项...
  8. c语言英美姓名,英美常用人名——C-D
  9. 《Linux就是这种范儿》读后感
  10. Dockerfile文件编写官方文档
  11. Java断言(assert)的介绍和使用
  12. Luogu P4915 帕秋莉的魔导书
  13. 基于 Arduino 的智能投石机制作
  14. 联发科天玑800适配鸿蒙系统,联发科天玑800U 5G芯片加持,Redmi Note9实际表现究竟如何?...
  15. tf.keras.layers.Layer自定义层
  16. 杰奇不支持mysql8,【教程】杰奇小说手机端安装使用说明
  17. 水煮三国(二) 能把梳子卖给和尚吗
  18. pyautogui.screenshot()详解
  19. 如何快速阅读一个c++大工程?
  20. 据说富翁一般有7种收入来源。有哪些简单的,在你睡觉时也能带来收入的方法呢?

热门文章

  1. 工业相机视野及焦距的计算公式
  2. WEB页调用电脑摄像头+拍照
  3. A-CSM认证培训全国首次开班
  4. 启动加速器比较:Y Combinator VS Techstars
  5. 4.9周末学习日记(初试蓝桥杯)
  6. px rem em rpx 区别 用法
  7. moviepy音视频剪辑:使用rotate函数实现视频变换处理以及参数expand取值为True时的花屏问题解决方案
  8. GridView 介绍
  9. GridView單行編輯保存
  10. 2019-9-2-windows-10「设置」应用完整ms-settings快捷方式汇总