当前位置:首页 > Java知识 > 正文内容

java打包文件夹并下载(java怎样打包)

abcsky883个月前 (02-08)Java知识65

本篇文章给大家谈谈

作者:Silently9527来源:blog.csdn.net/asdewq380303318/article/details/111500367前言兄弟们看到这个标题可能会觉得是个标题党,为了解决疑虑,我们先来看下最终的测试结果:

java打包文件夹并下载(java怎样打包)

测试云盘下载的文件 46M,自己本地最大下载速度 2M1. 单线程下载,总耗时: 603s

img2. 多线程下载,50个线程,总耗时:13s

img测试结果,提速46倍,我还是太谦虚了,只说提速30倍,此处我们觉得应该有掌声(我听不到,还是点赞实在)

HTTP协议Range请求头Range主要是针对只需要获取部分资源的范围请求,通过指定Range即可告网站推广报价图片欣赏知服务器资源的指定范围格式: Range: bytes=start-end比如:获取字节范围 5001-10000。

Range: bytes=5001-100001也可以指定开始位置不指定结束位置,表示获取开始位置之后的全部数据Range: bytes=5001-1服务器接收到带有Range的请求,会在处理请求之后返回状态码为

206 Partial Content的响应基于Range的特性,我们就可以实现文件的多线程下载,文件的断点续传准备工作本文我们使用的SpringMVC中的RestTemplate;由于云盘的链接是Https,所以我们需要设置。

RestTemplate绕过证书验证pom.网站推广报价图片欣赏xml

编写RestTemplate的构造器,以及绕过https的证书验证

在下载的过程中,我们需要知道当前下载的速度是多少,所以需要定义一个显示下载速度的接口

因为计算下载速度,我们需要知道每秒传输的字节数是多少,为了监控传输数据的过程,我们需要了解SpringMVC中的接口ResponseExtractor

该接口只有一个方法,当客户端和服务器端连接建立之后,会调用这个方法,我们可以在这个方法中监控下载的速度DisplayDownloadSpeed接口的抽象实现 AbstractDisplayDownloadSpeedResponseExtractor。

整个项目主要涉及到的类图

简单的文件下载器这里网站推广报价图片欣赏使用的是restTemplate调用execute, 先文件获取到字节数组, 再将字节数组直接写到目标文件这里我们需要注意的点是: 这种方式会将文件的字节数组全部放入内存中, 及其消耗资源;我们来看看如何实现。

创建ByteArrayResponseExtractor类继承AbstractDisplayDownloadSpeedResponseExtractor

调用restTemplate.execute执行下载,保存字节数据到文件中

测试下载819M的idea

执行一段时间之后,我们可以看到内存已经使用了800M左右,所以这种方式只能使用于小文件的下载,如果我们下载几G的大文件,内存肯定是不够用的网站推广报价图片欣赏至于下载时间,因为文件太大也没有等下载完成就结束了程序单线程大文件下载。

上面的方式只能下载小的文件,那大文件的下载我们该用什么方式呢?我们可以把流输出到文件而不是内存中接下来我们来实现我们大文件的下载创建FileResponseExtractor类继承AbstractDisplayDownloadSpeedResponseExtractor。

,把流输出到文件中

文件下载器,先把流输出到临时下载文件(xxxxx.download),下载完成后在重命名文件

测试下载819M的idea

执行一段时间之后,我们再看看下内存的使用情况,发现这种方式内存消耗较少,效果比较理想,下载时间:199s

多线程文件下载如网站推广报价图片欣赏果服务器不限速的话,通常能够把自己本地的带宽给跑满,那么使用单线程下载就够了,但是如果遇到服务器限速,下载速度远小于自己本地的带宽,那么可以考虑使用多线程下载多线程我们使用CompletableFuture。

(可以参考文章 CompletableFuture让你的代码免受阻塞之苦)实现多线程文件下载的基本流程:首先我们通过Http协议的Head方法获取到文件的总大小然后根据设置的线程数均分文件的大小,计算每个线程的下载的字节数据开始位置和结束位置。

开启线程,设置HTTP请求头Range信息,开始下载数据到临时文件下载完成后把每个线程下载完成的临时文件合并成一个文件完成代码如下:

开启30个线程测网站推广报价图片欣赏试下载819M的idea

img

从执行的结果上来看,因为开启了30个线程同时在下载,内存的占用要比单线程消耗的多,但是也在接受范围内,下载时间:81s,速度提升2.5倍,这是因为idea的下载服务器没有限速,本次多线程速度的提升仅仅是在充分的压榨本地的带宽,所以提示的幅度不大。

单线程下载和对线程下载对比测试因为云盘对单个线程的下载速度做了限制,大概是在100kb,所以我们使用云盘的下载链接,来测试多线程和单线程的下载速度测试 云盘中 46M 的文件的下载速度,自己本地最大下载速度 2M。

获取文件的下载地址

“注意:从浏览器中获取的链接需要先使用URLDecode解码,否则下载会失败,并且云盘文件的网站推广报价图片欣赏下载链接是有时效性的,过期后就不能在下载,需要重新生成下载链接”测试单线程下载文件

执行的结果可以看出,云盘对单线程的下载限速真的是丧心病狂, 46M的文件下载需要耗时:600s测试多线程下载文件为了充分的压榨网速,找出最合适的线程数,所以测试了不同线程数的下载速度线程数下载总耗时10

60s2030s3021s4015s5013s从测试的结果上来看,对于自己的运行环境把线程数设置在30个左右比较合适

文件断点续传如何实现,欢迎在大家评论区说出自己的思路。源码地址:https://gitee.com/silently9527/fast-download

往期资源  需要请自取真香警告!Alibaba珍网站推广报价图片欣赏藏版mybatis手写文档,刷起来卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!字节跳动总结的设计模式 PDF 火了,完整版开放下载!堪称神级的Spring Boot手册,从基础入门到实战进阶

10k+点赞的Spring Boot后台管理系统竟然出了详细教程

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://4blc.com/post/15825.html

分享给朋友:

“java打包文件夹并下载(java怎样打包)” 的相关文章

java基础入门教学(java教学入门教程)

本文分享给大家的是: 大家好,9102小蛙首次在知乎上与大家见面鉴于小蛙第一次和大家见面,9102年也刚刚开始,也并没有什么好的礼物送给大家就祝大家新的一年里万事顺心,猪年大吉在这里我就把小蛙珍藏的视频教程分享给大家吧,这是一套java基础视频教程。 这套视频教程呢能让你开...

武汉java工程师培训机构(武汉java工程师培训学校)

今天给各位分享 互联网在不断的发展,企业中有很多项目都用到java开发技术,这也使得市面上相关java开发的岗位在逐渐的增多,同时,在这种开发市场不断发展的状态下,java培训市场也在不断的发展,有很多的小伙伴为了能够学习到更为系统的java开发技术知识,选择培训的方式来学习开发技...

idea开发javaweb(java开发环境的搭建idea)

本文分享给大家的是: 安装和配置IntelliJ IDEA后,就可以用它开发Java项目了,这里会手把手带领大家从头开始开发一个多模块的java项目1. IntelliJ IDEA 开发Java项目的流程新建项目(project) 新建模块(module)新建包(packa...

java和net哪个好就业(软件工程和java一样吗)

本文分享给大家的是: 在回答问题前先来谈谈什么是java和.net吧 相信说清楚了不知道了!JAVAJava是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。 Java语言作...

java面向对象的基本概念(java面向对象三大特点)

今天给各位分享 01PART类和对象的基本概念1,什么是类?什么是对象?类:是对象的抽象;对象:是类的实例;例如:男人,女人是类;XX的衣服,XX的手表示对象2,类有哪些组成?生活中:当我们拥有类时,一定对这个类定义了明确的特点和特征,还有行为。 程序中:程序中拥有类时,也...

java语言的特点有哪些(java语言主要特点是什么?)

本篇文章给大家谈谈   Java语言是一门优秀的编程语言,它之所以应用广泛,受到大众的欢迎是因为它有众多突出的特点,其中最主要的特点有以下几个  1.简单性  Java语言是一种相对简单的编程语言,它通过提供最基本的方法完成指定的任务。 程序员只需理解一些基本的概念,就可以...