实现原理:
用httpConnection.setRequestProperty("RANGE"
,
"bytes= xxx
-xxx"
);获取指定的数据块
用RandomAccessFile实现文件随机访问,写入指定数据块到文件.
关键事项:获取远程文件大小,根据文件大小确定下载线程个数(可固定线程数,也可固定每个线程下载数据块大小,用户自己决定).
package
org.ifusing.down;
import
java.io.*;
import
java.net.*;
/**
*
文件下载管理类
*/
public
class
DownLoadManager {
/**
*
每个线程下载的字节数
*/
static
final
long
unitSize
= 100 * 1024;
/**
*
启动多个线程下载文件
*/
public
void
doDownload(String remoteFileUrl)
throws
IOException {
String fileName =
new
URL(remoteFileUrl).getFile();
fileName = fileName.substring(fileName.lastIndexOf(
"/"
)+1,fileName.length()).replace(
"%20"
,
" "
);
long
fileSize =
this
.getRemoteFileSize(remoteFileUrl);
if
(fileSize == 0){
return
;
}
this
.createFile(fileName, fileSize);
long
threadCount = fileSize /
unitSize
;
System.
out
.println(
"
共启动 "
+ (fileSize %
unitSize
== 0 ? threadCount : threadCount + 1)
+
"
个线程"
);
long
offset = 0;
if
(fileSize <=
unitSize
) {
//
如果远程文件尺寸小于等于unitSize
DownloadThread downloadThread =
new
DownloadThread(remoteFileUrl,
fileName, offset, fileSize);
downloadThread.start();
}
else
{
//
如果远程文件尺寸大于unitSize
for
(
int
i = 1; i <= threadCount; i++) {
DownloadThread downloadThread =
new
DownloadThread(
remoteFileUrl, fileName, offset,
unitSize
);
downloadThread.start();
offset = offset +
unitSize
;
}
if
(fileSize %
unitSize
!= 0) {
//
如果不能整除,则需要再创建一个线程下载剩余字节
DownloadThread downloadThread =
new
DownloadThread(
remoteFileUrl, fileName, offset, fileSize
-
unitSize
* threadCount);
downloadThread.start();
}
}
}
/**
*
获取远程文件尺寸
*/
private
long
getRemoteFileSize(String remoteFileUrl)
throws
IOException {
long
fileSize = 0;
HttpURLConnection httpConnection = (HttpURLConnection)
new
URL(
remoteFileUrl).openConnection();
httpConnection.setRequestMethod(
"HEAD"
);
int
responseCode = httpConnection.getResponseCode();
if
(responseCode >= 400){
System.
out
.println(
"Web
服务器响应错误!"
);
return
0;
}
String sHeader;
for
(
int
i=1;;i++){
sHeader = httpConnection.getHeaderFieldKey(i);
if
(sHeader !=
null
&& sHeader.equals(
"Content-Length"
)){
System.
out
.println(
"
文件大小ContentLength:"
+httpConnection.getContentLength());
fileSize = Long.parseLong
(httpConnection.getHeaderField(sHeader));
break
;
}
}
return
fileSize;
}
/**
*
创建指定大小的文件
*/
private
void
createFile(String fileName,
long
fileSize)
throws
IOException {
File newFile =
new
File(fileName);
RandomAccessFile
raf =
new
RandomAccessFile
(newFile,
"rw"
);
raf.setLength(fileSize);
raf.close();
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package
org.ifusing.down
;
import
java.io.BufferedInputStream;
import
java.io.File;
import
java.io.IOException;
import
java.io.RandomAccessFile;
import
java.net.HttpURLConnection;
import
java.net.URL;
/**
*
负责文件下载的类
*/
public
class
DownloadThread
extends
Thread {
/**
*
待下载的文件
*/
private
String
url
=
null
;
/**
*
本地文件名
*/
private
String
fileName
=
null
;
/**
*
偏移量
*/
private
long
offset
= 0;
/**
*
分配给本线程的下载字节数
*/
private
long
length
= 0;
/**
*
@param
url
下载文件地址
*
@param
fileName
另存文件名
*
@param
offset
本线程下载偏移量
*
@param
length
本线程下载长度
*
*
@author
Angus.wang
*
*/
public
DownloadThread(String url, String file,
long
offset,
long
length) {
this
.
url
= url;
this
.
fileName
= file;
this
.
offset
= offset;
this
.
length
= length;
System.
out
.println(
"
偏移量="
+ offset +
";
字节数="
+ length);
}
public
void
run() {
try
{
HttpURLConnection httpConnection = (HttpURLConnection)
new
URL(
this
.
url
).openConnection();
httpConnection.setRequestMethod(
"GET"
);
httpConnection.setRequestProperty(
"RANGE"
,
"bytes="
+
this
.
offset
+
"-"
+ (
this
.
offset
+
this
.
length
- 1));
System.
out
.println(
"RANGE bytes="
+
this
.
offset
+
"-"
+ (
this
.
offset
+
this
.
length
- 1)
http://www.kcvg.cn
原创);
BufferedInputStream bis =
new
BufferedInputStream(httpConnection
.getInputStream());
byte
[] buff =
new
byte
[1024];
int
bytesRead;
File newFile =
new
File(
fileName
);
RandomAccessFile raf =
new
RandomAccessFile(newFile,
"rw"
);
while
((bytesRead = bis.read(buff, 0, buff.
length
)) != -1) {
raf.seek(
this
.
offset
);
raf.write(buff, 0, bytesRead);
this
.
offset
=
this
.
offset
+ bytesRead;
}
raf.close();
bis.close();
}
catch
(IOException ioe) {
ioe.printStackTrace();
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package
org.ifusing.downtest
;
/**
*
多线程文件下载测试
*
*/
public
class
FileDownloadTest {
/**
*
@param
args
*/
public
static
void
main(String[] args) {
try
{
String remoteFileUrl =
"http://dl_dir.qq.com/qqfile/qq/QQ2009/QQ2009SP5.exe"
;
DownLoadManager downLoadManager =
new
DownLoadManager();
downLoadManager.doDownload(remoteFileUrl);
}
catch
(Exception e){
e.printStackTrace();
}
}
}
分享到:
相关推荐
孙卫琴.Tomcat与Java.Web开发技术详解.part3.rar 分三次压缩,第四为源码
Java Web整合开发王者归来
架构探险 从零开始写javaweb框架书上源码,是真的。不是假的。迅雷下载后是一个404HTML页面。
SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...
Java高手真经之应用框架卷:Java.Web核心框架 完整代码 完整光盘内容 物超所值~~由于原文件过大(257M),所以提供下载地址(Java高手真经.应用框架卷downUrl.txt),直接复制即可进行迅雷下载,如出现问题请留言~~...
2.13 成功可以复制——迅雷创始人邹胜龙 57 第3堂课 java语言基础知识 59 视频讲解:178分钟 3.1 java主类结构 60 3.1.1 定义类包 60 3.1.2 定义类 60 3.1.3 导入api类库 60 3.1.4 定义变量 61 3.1.5 定义...
实例203 用Servlet获取Web服务器信息 666 实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看数据库 686 实例207 简单的BBS论坛 697 第21章 Java程序综合案例:教务处...
全套java web开发视频,共87集,很详细,讲课人:张龙老师。 使用方法:下载后解压得到的downlist文件用迅雷下载就可以了。
介绍了Java EE领域的三个开源框架:Struts 2、Spring和Hibernate。 这是第二部分。
0236.zip+HTML原创视频教程.rar+Java Web培训视频(wmv).rar+javaweb开发实战经典(更新至94集).rar+Java核心基础视频教程展示.rar+OA系统课程(共23讲)(附带设计文档+代码).rar+Oracle 11g数据库管理员指南-...
本书下载链接,电驴,迅雷皆可 ed2k://|file|%E7%B2%BE%E9%80%9AJava.EE%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B-%E5%9F%BA%E4%BA%8EEclipse.Spring.Struts.Hibernate%E5%85%89%E7%9B%98%E6%BA%90%E7%A0%81.rar|...
本书下载链接,电驴,迅雷皆可 ed2k://|file|%E7%B2%BE%E9%80%9AJava.EE%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B-%E5%9F%BA%E4%BA%8EEclipse.Spring.Struts.Hibernate%E5%85%89%E7%9B%98%E6%BA%90%E7%A0%81.rar|...
本书下载链接,电驴,迅雷皆可 ed2k://|file|%E7%B2%BE%E9%80%9AJava.EE%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B-%E5%9F%BA%E4%BA%8EEclipse.Spring.Struts.Hibernate%E5%85%89%E7%9B%98%E6%BA%90%E7%A0%81.rar|...
SQL Server数据库设计和高级查询、深入.NET平台和C#编程、在.NET框架下开发三层结构数据库应用系统、JavaScript客户端验证和页面特效制作、使用Java实现面向对象编程、使用JSP开发WEB应用系统、职业导向训练、项目...
本书下载链接,电驴,迅雷皆可 ed2k://|file|%E7%B2%BE%E9%80%9AJava.EE%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B-%E5%9F%BA%E4%BA%8EEclipse.Spring.Struts.Hibernate%E5%85%89%E7%9B%98%E6%BA%90%E7%A0%81.rar|...
java安卓仿微信聊天软件源码 frontend-navigation 技术资讯信息导航,我想记录一些技术的地址方便自己没事的时候逛 列表 腾讯 阿里 百度 搜狐 新浪 360 携程 网易 迅雷 angular资源 微信html5开发框架 综合类 入门类...
java web jsp 开发,tomcat相关 jar 包, servlet-api.jar
Selenium[1] 也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...