java urlconn 下载慢_使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法...
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
/**
* 多线程下载
* @author bing
*
*/
public class OmbDownloadOfThreadsUtil {
private String urlPath ; // 资源网络路径
private String targetFilePath ; // 所下载文件的保存路径
private int threadNum ; // 启用多少条线程进行下载
// 用于下载线程对象集合
private DownloadThread[] downloadThreads ;
// 要下载文件的大小
private int fileSize ;
public OmbDownloadOfThreadsUtil(String urlPath, String targetFilePath,
int threadNum) {
this.urlPath=urlPath;
this.targetFilePath=targetFilePath;
this.threadNum=threadNum;
downloadThreads=newDownloadThread[threadNum] ;
}
public void downloadFile() throws Exception{
URL url=newURL(urlPath) ;
HttpURLConnection conn= (HttpURLConnection) url.openConnection() ;
conn.setConnectTimeout(4*1000) ;
conn.setRequestMethod("GET") ;
conn.setRequestProperty(
"Accept",
"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(
"User-Agent",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Trident/4.0; " +
".NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; " +
".NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
//设置为长连接
conn.setRequestProperty("Connection", "Keep-Alive");
//得到要下载文件的大小
fileSize=conn.getContentLength() ;
System.out.println("fileSize:"+fileSize);
//断开连接
conn.disconnect() ;
//计算每条线程需要下载的大小
int preThreadDownloadSize=fileSize/threadNum+1 ;
System.out.println("preThreadDownloadSize:"+preThreadDownloadSize);
RandomAccessFile file=newRandomAccessFile(targetFilePath, "rw") ;
file.setLength(fileSize) ;
file.close() ;
for (int i=0; i
// 计算每条线程下载的起始位置
int startPos=i*preThreadDownloadSize+1 ;
RandomAccessFile currentPart=newRandomAccessFile(targetFilePath, "rw") ;
currentPart.seek(startPos) ;
downloadThreads[i] = new DownloadThread(startPos,preThreadDownloadSize,currentPart) ;
new Thread(downloadThreads[i]).start() ;
}
}
/**
* 获取下载的完成百分比
* @return 完成的百分比
*/
public double getCompleteRate() {
// 统计多条线程已经下载的总大小
int sumSize=0;
for (int i=0; i
sumSize += downloadThreads[i].hasReadLength;
}
// 返回已经完成的百分比
return sumSize * 1.0 / fileSize;
}
/**
* 用于下载的线程
* @author bing
*
*/
private final class DownloadThread implements Runnable{
private int startPos ;
private int preThreadDownloadSize ;
private RandomAccessFile currentPart ;
//已下载长度
private int hasReadLength ;
public DownloadThread(int startPos, int preThreadDownloadSize,
RandomAccessFile currentPart) {
this.startPos=startPos;
this.preThreadDownloadSize=preThreadDownloadSize;
this.currentPart=currentPart;
}
@Override
public void run() {
InputStream inputStream=null;
try{
URL url=newURL(urlPath) ;
HttpURLConnection conn= (HttpURLConnection) url.openConnection() ;
conn.setConnectTimeout(4*1000) ;
conn.setRequestMethod("GET") ;
conn.setRequestProperty(
"Accept",
"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=conn.getInputStream() ;
inputStream.skip(startPos) ;//定位到开始位置
byte[] buffer=newbyte[1024] ;
int temp=0;
while(hasReadLength
&&(temp=inputStream.read(buffer))!=-1){
currentPart.write(buffer,0,temp) ;
hasReadLength += temp ;
}
}catch(Exception e){
e.printStackTrace() ;
}finally{
try {
currentPart.close() ;
} catch (Exception e) {
e.printStackTrace();
}
try {
inputStream.close() ;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception {
String songName="许嵩 - 半城烟沙.mp3";
songName=URLEncoder.encode(songName,"UTF-8") ;
String urlPath="http://172.16.2.50:8080/mp3/"+songName ;
String targetDir="E:"+File.separator+songName ;
OmbDownloadOfThreadsUtil odtu=newOmbDownloadOfThreadsUtil(urlPath,targetDir, 6) ;
odtu.downloadFile() ;
}
}
相关文章:

java中Array和ArrayList区别
2019独角兽企业重金招聘Python工程师标准>>> 1)精辟阐述: 可以将 ArrayList想象成一种“会自动扩增容量的Array”。 2)Array([]):最高效;但是其容量固定且无法动态改变; …

【组队学习】【31期】 吃瓜教程——西瓜书+南瓜书
吃瓜教程——西瓜书南瓜书 航路开辟者:谢文睿、秦州领航员:张海腾航海士:谢文睿、秦州 基本信息 开源内容:https://github.com/datawhalechina/pumpkin-bookB 站视频:https://www.bilibili.com/video/BV1Mh411e7VU内…

设计模式之“代理模式”
代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行…

php更新数据库时间戳,关于Thinkphp5 里面数据库自动更新与创建时间的问题
我们有时候往数据库里面写入新的一条数据 时,可能需要自动更新时间、自动创建时间、这样就可以方便我们、从而大大减小我们的代码量;不过在TP5里面有一个小规律,就是save()与insert()语句的区别;1、我们先看一下TP5里面自动更新时…

【组队学习】【31期】LeetCode 刷题
LeetCode 刷题 航路开辟者:杨世超领航员:刘军航海士:杨世超、李彦鹏、叶志雄、赵子一 基本信息 开源内容:https://github.com/itcharge/LeetCode-Py开源电子书:https://algo.itcharge.cn内容属性:合作课…

DOM---文档对象模型(Document Object Model)的基本使用
一、DOM简介 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(目…

剑指offer--3题
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组…

php可以打印一个页面,利用html实现分页打印功能的实例详解
本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的。页面打印/* 应用这个样式的在打印时隐藏 */.noPrint {display: none;}/* 应用这个样式的,从那个标签结束开始另算一页&#x…

java动态加载配置文件
最近项目中需要做定时任务,即定时数据库的备份。定时时间用户可以在界面中配置,要求配置修改好立即生效。 想不到什么好办法。下面是一种实现思路 把用户配置的时间存到properties配置文件中,定时任务每隔一分钟执行一次,每次执行…

商品秒杀,防并发解决思路
我们在做电商项目的时候,经常会遇到抢购秒杀的问题,综合来说主要是两个问题 一,高并发情况下对数据库产生的压力 二,如何避免超卖(库存< 0)的情况。 针对这两个问题来谈下解决思路 一,缓解数据库压力 用 缓存就可以解决 例如redis,memecac…

【组队学习】【31期】动手学数据分析
动手学数据分析 航路开辟者:陈安东、金娟娟、杨佳达、老表、李玲、张文涛、高立业领航员:陈玉立航海士:陈安东、武帅、肖涵哲、叶前坤、沈豪 基本信息 开源内容:https://github.com/datawhalechina/hands-on-data-analysis内容…

php不报错怎么回事,解决PHP 7等web编程语言不报错一例
PHP的开发者必须尽快转到PHP 7平台,因为原来在PHP 5下开发的程序,有很多在PHP 7下都会报错。PHP 5的程序改为PHP 7的写法,工作量是很大的,所以开发者只能一步到位转到PHP 7平台。PHP 7增强了数据类型;数组与变量名不能…

在存储过程中如何实现将ID列表字符串传入IN()
我们在平常编写sql语句时,经常碰到要把id列表字符串(比如:001,002,003,....)当做参数传递给存储过程, 那么在存储过程中要用in作为条件进行记录的过滤,那么采用in(idList)࿰…

【组队学习】【31期】数据可视化(Matplotlib)
数据可视化(Matplotlib) 航路开辟者:杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员:贾献华航海士:杨剑砺、郭棉昇、张文恺、肖桐 基本信息 开源内容:https://github.com/datawhalechina/fantastic-matplo…

java学习路线图(2018年最新版)
最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从何下…

php instr函数,oracle的instr函数用法
这几天在做一个项目的时候,做到关于用户组权限分配的问题,用到了Oracle的instr函数,现在好好学习下这个函数吧。 在Oracle/PLSQL中, instr 函数返回要截取的字符串在源字符串中的位置。 语法如下:instr( string1, stri…

浏览器内核Trident/Gecko/WebKit/Presto
“浏览器内核”主要指渲染引擎(Rendering Engine),负责解析网页语法(如HTML、JavaScript)并渲染、展示网页。因此,所谓的浏览器内核通常也就是指浏览器所采用的渲染引擎, 渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏…
Intellij IDEA 将工程转换成maven工程 详解
1> 右键工程,点击 Add Framework Support2> 选中 Maven,再点击 OK3> 工程根目录自动生成 pom.xml 文件,这样 工程就支持 Maven版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/che…

【组队学习】【31期】水很深的深度学习
水很深的深度学习 航路开辟者:刘洋领航员:陈宇航海士:刘洋、陈陟原、左凯文、初晓宇、刘羽中 基本信息 开源内容:https://github.com/datawhalechina/unusual-deep-learning内容属性:公测课程内容说明:本…

php返回结果判断,老司机在判断返回结果时翻了个身(ThinkPHP)
“这篇文章属于基本内容。看到它的学生检查他们的代码是否有同样的问题“序言小q又带着问题来了,今天的问题估计是大多数同志都会犯的问题。问题是使用ThinkPHP时查询返回的结果是否为空。你自信吗?你不知道的是空的!如果你是这样认为的&…

ZooKeeper客户端地址列表的随机原理
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nileader.blog.51cto.com/1381108/932948查看PDF版本 转载请用注明:ni掌柜nileadergmail.com 在之前一个文章《ZooKeeper Jav…

Intellij IDEA使用教程(超详细)
转自 http://www.phperz.com/article/15/0923/159067.html转载于:https://www.cnblogs.com/lijingran/p/8585430.html

【组队学习】【31期】青少年编程(Scratch 四级)
青少年编程(Scratch 四级) 航路开辟者:王思齐、马燕鹏领航员:马燕鹏航海士:王思齐、马燕鹏 基本信息 开源内容:https://github.com/datawhalechina/team-learning-program/tree/master/Scratch内容属性&…

java中mypoiexception,java - 如何使用Poi获取Java中单元格的数据验证源? - 堆栈内存溢出...
此问题包含多个不同的问题。首先,我们需要获取工作表的数据验证,然后为每个数据验证获取数据验证所适用的Excel单元格范围。 如果该单元格位于该单元格范围之一中,并且数据验证是列表约束,则进行进一步处理。 否则返回默认值。如果…

[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt--//简单探究12c TABLE ACCESS BY INDEX ROWID BATCHED特性.--//当使用12c时,执行计划出现TABLE ACCESS BY INDEX ROWID BATCHED,做一些探究.--//本文主要探究如何使用提示或者隐含参数控制这种特性.1.环境:SCOTTtest01…

Angularjs集成第三方js插件之Uploadify
有时候需要用一些第三方插件,比如datepicker,slider,或者tree等。以前的做法是直接通过jquery取得某个元素,然后调用某个方法即可。但在angularjs中,不能直接这么写,必须写在directive中。 开源项目Angular…

备考12月份电子学会青少年编程能力等级测试(图形化)的公益训练营即将开营
一、考试安排 考试方式 考试形式:在线居家考试(全国)报名时间:9月26日08:00 ~ 11月23日16:00退费截止时间:11月23日16:00准考证下载时间:11月30日 ~ 考前1天 考前集中测试时间 12月9日(周四…

mysql left join超时,MySQL 行锁超时排查方法优化
一、大纲#### 20191219 10:10:10,234 | com.alibaba.druid.filter.logging.Log4jFilter.statementLogError(Log4jFilter.java:152) | ERROR | {conn-10593, pstmt-38675}executeerror.updatexxxsetxxx ? , xxx ?whereRowGuid ?com.mysql.jdbc.exceptions.jdbc4.MySQLTra…

【优秀作业】蚁群优化算法
蚁群优化算法 一.概述 生物学家发现,自然界中的蚁群觅食是一种群体性行为,并非单只蚂蚁自行寻找食物源。蚂蚁在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表…

RPC-原理及RPC实例分析
还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞; (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻塞 区别 在学校期间大家都写过不少程序,比如写个…