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 urlconn 下载慢_使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法...相关推荐

  1. python3.8.3下载不了nltk_在ubuntu16.04+python3.5情况下安装nltk,以及gensim时pip3安装不成功的解决办法...

    在ubuntu16.04+python3.5情况下安装nltk,以及gensim时pip3安装不成功的解决办法,我刚开始因为不太会用linux命令,所以一直依赖于python 的pip命令,可是怎么都 ...

  2. win10应用商店打不开_首发!打不开苹果应用商店的优质解决办法

    App Store 前几期教长给同学们讲到修改 DNS 并不能解决 App Store 无法下载应用的问题,但也并未给出更好的解决办法,但教长是那种吊胃口的人吗,显然不是,琢磨了近两天,终于看到点苗头 ...

  3. android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...

    ####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.i ...

  4. java HelloWorld时报错:“找不到或无法加载主类“问题的解决办法

    java HelloWorld时报错:"找不到或无法加载主类"问题的解决办法 参考文章: (1)java HelloWorld时报错:"找不到或无法加载主类"问 ...

  5. java从github下载项目_在github下载的java项目通过idea打开(全流程图文,傻瓜式)

    今天从github把我以前写的一个小demo下载下来了,第一次下载项目,摸索了一个多小时,才运行起来. 下载有两种方法,通过git下载,或者直接压缩包下载,我选的时压缩包下载(因为还没学会git下载 ...

  6. aaynctask控制多个下载进度_使用 Python 下载的 11 种姿势,一种比一种高级

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 原文链接:http://dwz.date/cQjK 在本教程中,你将学习如 ...

  7. 我的世界java版游戏崩溃_我的世界全攻略之-游戏崩溃的解决方法

    我的世界崩溃怎么办?下面吾爱网小编给大家带来我的世界无法正常启动的解决方法,需要的朋友可以参考下. 我的世界作为许多玩家都十分喜爱的模拟经营沙盘类游戏,经常有玩家反映在玩我的世界的时候,游戏总是会出现 ...

  8. java se13安装教程_在Linux发行版中安装Java 13/OpenJDK 13的方法

    本文介绍在Linux发行版Ubuntu 18.04/16.04.Debian 10/9.CentOS 7/8.Fedora 31/30/29中安装Java 13/OpenJDK 13.Java SE ...

  9. java.policy无法修改_如何配置Policy文件进行Java安全策略的设置

    中国人最喜欢访问的网站 只要注册ofo就送你10块钱,还等什么,快来注册吧 Java语言具有完善的安全框架,从编程语言.编译器.解释程序到Java虚拟机,都能确保Java系统不被恶意的代码或敌对的编译 ...

最新文章

  1. 算法笔记_114:等额本金(Java)
  2. Teradata收购Think Big Analytics 提升大数据咨询能力
  3. 监测linux一些重要文件md5值脚本
  4. 补码、无符号数减法运算
  5. VC++的windows服务
  6. ES6(三)——Set、WeakSet、Map、WeakMap
  7. Hadoop DistCp工具简介及其参数
  8. 在 java 的 bin 目录下,jdk 提供了很多使用的工具,下面学习一些监控和故障处理的工具。...
  9. 由“美图秀秀”软件的网站,看网站的生存模式
  10. 使用Hibernate注解Annotations进行对象映射的异常处理
  11. 电脑程序无法打开,开机5S后速度变慢,程序无法安装
  12. Ubuntu下安装Nginx服务器并进行优化
  13. 统计学习基础:数据挖掘、推理和预测_百度零基础深度学习笔记(三) 波士顿房价预测...
  14. 【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
  15. Drools workbench kie-server部署和简单使用(全流程
  16. steam新授权软件_「西米软件推荐」桌面乱七八糟的人,请认真看完
  17. 【电脑】VirtualBox 安装 Win98 写网页
  18. C语言中数据的输出格式有哪些?
  19. EMC与电阻、电容和电感的关系
  20. Python 获取指定日期是周几 3种方法

热门文章

  1. 利用runtime实现KVO
  2. Python自动化开发学习6
  3. [转]Linux 的多线程编程的高效开发经验
  4. 4月第4周全球域名商TOP15:万网第四 增势减弱
  5. 避免死锁的一些注意事项
  6. IPsec ××× 配置實例
  7. iphone 下拉刷新控件 EGORefreshTableHeaderView 手动显示更新
  8. PowerBuilder 11.x 的重要进步和不足
  9. 201671030129 周婷 《英文文本统计分析》结对项目报告
  10. 深入理解Java中为什么内部类可以访问外部类的成员