实现原理:
用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整合开发王者归来
Java浏览器和迅雷源代码是两个相关项目,主要用于学习和理解如何使用Java语言来实现浏览器功能和模拟迅雷下载机制。这两个项目可以帮助开发者深入理解网络通信、网页解析以及多线程下载等关键技术。 首先,Java...
《架构探险:从零开始写JavaWeb框架》是一本深入探讨JavaWeb开发技术的书籍,其核心内容是通过源码分析来帮助读者理解并构建自己的Web框架。书中的源码提供了实际的编程实践,使读者能够亲身体验到JavaWeb框架的实现...
《JAVA项目开发全程实录》是一本深入浅出的Java编程实践指南,旨在帮助读者从理论到实践,全面掌握Java项目开发的各个环节。这本书涵盖了从项目规划、设计、编码、测试到部署的全过程,是Java开发者提升技能和经验的...
根据提供的文件信息,我们可以将重点放在“2018迅雷面试题”的相关内容上,特别是与Java相关的面试知识点。下面将结合标题、描述以及部分内容,提取出与Java相关的面试知识点。 ### Java相关知识点 #### 1. Java...
通过下载提供的"java的开发视频教程.downlist"文件,你可以利用迅雷或其他下载工具获取完整的教程资源,开始你的Java Web开发之旅。这套教程对于想系统学习和提升Java Web技能的开发者来说,是一份宝贵的资料。
1. J2EE(Java 2 Platform Enterprise Edition)企业版,主要用于开发企业级应用程序,如Web应用,包含Servlet和JSP等技术。 2. J2SE(Java 2 Platform Standard Edition)标准版,是其他两个版本的基础,适用于桌面...
### 迅雷Java高级程序员面试经验分享 #### 一、面试流程回顾 迅雷作为国内知名的互联网企业之一,在招聘Java高级程序员时采取了严格的筛选流程。本次面试经历从下午2点半持续到了晚上8点,共计5.5小时,主要包括了...
SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...
Java EE 是用于开发可伸缩的企业级应用程序的平台标准,涵盖了Java SE的所有特性,并在此基础上添加了面向企业级开发的功能,如Web服务、事务处理、安全性和持久化层的支持等。 #### 1. Web 应用开发 - **Servlet**...
- **J2EE(Java 2 Platform Enterprise Edition)**:企业版,针对Web应用和企业级系统的开发。 - **J2ME(Java 2 Platform Micro Edition)**:小型版,主要用于移动设备和嵌入式系统。 **1.2.3 Java版本更迭** -...
Java的特点包括简单性、面向对象、健壮性、安全性以及高效性,使得它在Web应用、移动应用、企业级应用等领域都有广泛应用。 二、Java环境配置 学习Java首先需要安装Java Development Kit (JDK),它是开发和运行Java...
Java是一种广泛使用的编程语言,在软件开发、Web应用、移动应用(尤其是Android应用)等领域有广泛应用。 #### 描述解析: - **描述:“完整的java视频教学。打开迅雷,再复制网址即可下载!!!”**:这段描述强调...
【标题】:“利用Java做的下载软件”是一种基于Java编程语言实现的多线程下载工具,它的功能和操作体验类似于市面上流行的迅雷下载器。这款软件的设计与实现充分展示了Java在处理网络数据传输和多任务并发方面的强大...
实例203 用Servlet获取Web服务器信息 666 实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看数据库 686 实例207 简单的BBS论坛 697 第21章 Java程序综合案例:教务处...
首先,对于初学者,"java私塾初级视频在线观看.html"和"java私塾初级视频迅雷下载.html"提供了基础的Java教程资源。这些资源通常会涵盖Java语言的基础语法,包括数据类型、变量、控制结构(如if语句和循环)、类与...
- **Java EE (Java Platform Enterprise Edition)**:为企业级应用提供了一套完整的解决方案,包括Servlet、JSP等技术,主要用于Web应用开发。 - **Java SE (Java Platform Standard Edition)**:是Java体系的基础...