在java中,我们可以通过URL和HttpURLConnection实现对资源的多线程下载,以此来减少资源的下载时间,下面是一个实现多线程下载的例子,不足的是没实现断点下载的功能
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownLoadTool{
public void resourceDownLoad(String path) throws Exception {
//网络资源路径
//如path = "http://www.hackvip.com/desk/d/0/3/2006110911245141091.jpg";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(6*1000);
conn.setRequestMethod("GET");
//获得网络上文件的大小
int fileSize = conn.getContentLength();
//线程的数量
int threadNum = 4;
//我用三个线程对文件进行下载,每个线程下载量为
int block = fileSize/threadNum + 1;
conn.disconnect();
//保存在项目的根目录下,如我下载的是一张图片
File file = new File("a.jpg");
RandomAccessFile rfile = new RandomAccessFile(file,"rw");
rfile.setLength(fileSize);
rfile.close();
for (int i = 0; i < threadNum; i++) {
int startPosition = i*block;
RandomAccessFile randomFile = new RandomAccessFile(file,"rw");
//从文件的什么位置开始写入
randomFile.seek(startPosition);
new DownLoadThread(i,url,randomFile,startPosition,block).start();
}
byte[] b = new byte[1];
System.in.read(b);
while(!(b[0]=='q')){
Thread.sleep(5*1000);
}
}
private class DownLoadThread extends Thread{
private URL url = null;
private RandomAccessFile rfile = null;
private int startPosition = 0;
private int block = 0;
private int i = 0;
public DownLoadThread(int i,URL url, RandomAccessFile rfile,
int startPosition, int block) {
this.i = i;
this.url = url;
this.rfile = rfile;
this.startPosition = startPosition;
this.block = block;
}
@Override
public void run() {
try {
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Range", "bytes" + startPosition + "-");
conn.setConnectTimeout(6*1000);
InputStream is = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = -1;
int readSize = 0;
while(readSize<block && ((len=is.read(buffer))!=-1)){
rfile.write(buffer, 0, len);
readSize += len;
}
rfile.close();
is.close();
conn.disconnect();
System.out.println("第" + (++i) + "个线程下载完成");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
编写一个测试类,传入一个资源路径,当然前提是该资源网站没有设置防盗链
import org.junit.Test;
public class DownLoadTest {
@Test
public void test() {
String path = "http://www.hackvip.com/desk/d/0/3/2006110911245141091.jpg";
try {
new DownLoadTool().resourceDownLoad(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
Java多线程下载网络资源,已打成可执行jar包,下载时只需修改相应配置文件即可
这个是关于Java多线程方面的技术,就是多个线程发送请求,从互联网上下载图片资源,通过这个案例可以知道Java中的多线程的基础知识
网络资源的多线程下载,网络资源的多线程下载
用java多线程实现下载网络资源,下载完毕后合并。下载速度很快,源代码齐全。非常难得
在实际项目中 多线程用的比较广泛 本人根据网络资源整理出了一个小小的多线程实例 大家有需要可以下载
学习多线程和java,实现了一个多线程下载网络资源的示例,大家互相交流
目前。...该文在7ava网络和多线程技术的基 础上,提出了一个简单而实用的文件分割算法,并据此设计开发了一个的简单实府的网络资源下栽工具.使用该下裁工具可以实现 对多种格式的网络文件的浏览和下栽
java用多线程实现消息的压入栈和从消息栈中取出消息,使用在一些如访问网络时某些线程往消息栈中压入消息,某些线程从栈中取出消息并访问网络获取资源等场景。
Java多线程与线程安全实践-基于Http协议的断点续传.rar 是一个Java毕业设计项目,旨在探讨如何在Java中实现多线程下载和断点续传功能,同时确保线程安全。该项目的主要特点如下: 1. 多线程下载:项目采用了Java的...
# Java多线程与线程安全实践-基于Http协议的断点续传.zip中文介绍 这个压缩文件包含了一个Java多线程与...如果您正在学习Java多线程编程,或者正在寻找一个实用的断点续传实现,那么这个项目将是一个很好的学习资源。
Unix操作系统环境下,应用程序可以利用fork... 可以说:Java语言对应用程序多线程能力的支持增强了Java作为网络程序设计语言的优势,为实现分布式应用系统中多客户端的并发访问以及提高服务器的响应效率奠定坚实基础。
这是java实现多线程断点续传下载功能的源代码,对于学习java网络编程、多线程等基础知识的同学有一定的参考作用,希望能够这个资源能够对你们有帮助
可以使用Java中的多线程技术,例如通过创建多个线程同时下载文件的不同部分,从而提高下载速度和效率。 断点续传设计:为了支持断点续传,需要在下载过程中记录已下载的文件部分,并在下次下载时从断点处继续下载。...
1.通过读取源文件多线程自动下载所有网络资源到本地硬盘 2.遇到下载故障在控制台打印错误信息 3.允许自定义源文件的地址,保存下载文件的目录要自动创建 4.允许自定义同时下载的任务数量,不指定默认开启10个下载任务 ...
完整版 Java高级教程 Java语言程序设计 第2章 Java多线程(共24页).ppt 完整版 Java高级教程 Java语言程序设计 第2章 哲学家的故事(共7页).ppt 完整版 Java高级教程 Java语言程序设计 第3章 Java网络基础知识(共...
本资源包“Java多线程与线程安全实践-基于Http协议的断点续传.rar”是一个针对计算机科学专业学生设计的毕业设计或课程项目源码文件集合。该项目旨在通过实现一个基于HTTP协议的文件断点续传功能,深入探索和实践...
在实现断点续传的过程中,我们需要考虑如何使用Java多线程来实现文件的分块下载和断点续传。具体步骤如下: 2.1 连接到服务器 使用Java的HttpURLConnection类连接到服务器,并发送GET请求获取要下载的文件的基本...
JAVA源码JAVA多线程与线程安全实践-基于Http协议的断点续传本资源系百度网盘分享地址
使用Java开发的地图瓦片图下载工具,支持以下XYZ瓦片图下载与合并。多线程瓦片图下载,最大限度地使用本机网络资源。