import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class MulThreadDownload {
/**
* @param args
*/
public static void main(String[] args) {
String path = "http://net.itcast.cn/QQWubiSetup.exe";
try {
new MulThreadDownload().download(path, 3);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从路径中获取文件名称
* @param path 下载路径
* @return
*/
public static String getFilename(String path){
return path.substring(path.lastIndexOf('/')+1);
}
/**
* 下载文件
* @param path 下载路径
* @param threadsize 线程数
*/
public void download(String path, int threadsize) throws Exception{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
int filelength = conn.getContentLength();//获取要下载的文件的长度
String filename = getFilename(path);//从路径中获取文件名称
File saveFile = new File(filename);
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同
accessFile.close();
//计算每条线程下载的数据长度
int block = filelength%threadsize==0? filelength/threadsize : filelength/threadsize+1;
for(int threadid=0 ; threadid < threadsize ; threadid++){
new DownloadThread(url, saveFile, block, threadid).start();
}
}
private final class DownloadThread extends Thread{
private URL url;
private File saveFile;
private int block;//每条线程下载的数据长度
private int threadid;//线程id
public DownloadThread(URL url, File saveFile, int block, int threadid) {
this.url = url;
this.saveFile = saveFile;
this.block = block;
this.threadid = threadid;
}
@Override
public void run() {
//计算开始位置公式:线程id*每条线程下载的数据长度= ?
//计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =?
int startposition = threadid * block;
int endposition = (threadid + 1 ) * block - 1;
try {
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.seek(startposition);//设置从什么位置开始写入数据
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);
InputStream inStream = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
accessFile.write(buffer, 0, len);
}
inStream.close();
accessFile.close();
System.out.println("线程id:"+ threadid+ "下载完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
相关推荐
我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现的源代码,原文地址:http://blog.csdn.net/ouyang_peng/article/details/10125409
在Android开发中,为了提升用户...总的来说,Android中使用HTTP协议实现多线程断点下载,需要对HTTP协议、线程管理、文件操作和错误处理有深入理解。通过合理的设计和实现,可以有效地提高大文件下载的效率和用户体验。
我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现的源代码,原文地址:http://blog.csdn.net/ouyang_peng/article/details/10125409 这个进行了优化
我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现的源代码,原文地址:http://blog.csdn.net/ouyang_peng/article/details/10125409 这个进行了第二次优化
为了实现多线程,我们需要创建多个线程,每个线程负责下载文件的一部分。以下是一个基本的步骤概述: 1. **文件分块**:根据文件大小,确定合适的分块大小,例如1MB,然后计算出需要多少个线程来下载这些块。 2. *...
在Android应用开发中,多线程下载是一项关键技术,它能显著提高大文件下载的效率,尤其是在网络条件不稳定的情况下。断点续传是多线程下载的一个重要特性,允许用户中断下载后,从上次停止的位置继续,提高了用户...
而`MultiDownLoadDemo`这个文件可能是一个示例代码或者项目,你可以参考它来理解和实现多线程下载功能。记住,实际开发中还需要考虑错误处理、网络状态变化、用户界面更新等细节,以提供更健壮的下载服务。
在Android平台上,实现HTTP多线程下载是一项常见的需求,它能显著提高大文件下载的速度,尤其是在网络环境不稳定或带宽有限的情况下。本文将详细讲解如何在Android应用中实现这一功能。 首先,理解HTTP协议是基础。...
在Android平台上,实现文件的多线程断点下载是一项常见的任务,这有助于提高下载速度并允许用户在中断后继续未完成的下载。以下是一个详细解释这个过程的关键知识点: 1. **HTTP请求与响应**: - HTTP是互联网上...
接着,我们探讨如何实现多线程下载。一个核心概念是`ExecutorService`,它允许我们管理和控制线程池。我们可以通过`Executors`工厂类创建`ExecutorService`,然后使用`submit()`方法提交下载任务。每个任务可以封装...
Android提供了几种实现多线程的方式,包括线程池、AsyncTask、Handler/Looper、IntentService等。 开源代码中可能使用了线程池(ThreadPoolExecutor)来管理下载任务,线程池可以有效地控制运行的线程数量,避免...
在Android应用开发中,实现多线程断点续传下载是一项重要的技术,它能提高下载效率,节省用户时间,并提供良好的用户体验。以下是对这个主题的详细解析: **1. 多线程下载** 多线程下载是将一个大文件分成多个小块...
Andorid的HTTP协议多线程断点下载应用程序。直接使用单线程下载HTTP文件对我们来说是一件非常简单的事。那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点。 使用多线程的好处:使用多线程下载...
在Android平台上,将网页内容通过HTTP协议下载到指定文件夹是一项常见的任务,尤其在离线浏览、数据缓存或者后台更新资源的场景中。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它允许客户端(如...
总的来说,这个压缩包提供了一个完整的Android断点续传下载实现,涵盖了网络请求、多线程、文件操作和进度监控等多个方面,是学习和实践Android下载功能的好材料。通过深入研究这些源代码,开发者可以更好地理解和...
通过以上知识点的整合和实现,我们可以构建一个高效、稳定且用户体验良好的Android多线程断点续传下载器。在实际项目中,还需要考虑网络状况变化、电量管理、存储空间检测等更多细节,以打造更完善的下载解决方案。
标题“Delphi多线程批量下载”指的是使用Delphi编程语言实现的一个功能,即通过创建多个线程来同时下载多个文件。Delphi7是这个系统可能使用的版本,它支持Windows API和VCL库,提供强大的面向对象编程能力。 在...
本篇将深入探讨如何在Android环境中实现多线程下载,以及相关的重要知识点。 **1. Android主线程与子线程** Android应用的UI操作必须在主线程中执行,否则会抛出`NetworkOnMainThreadException`异常。因此,下载...
在Android中实现多线程下载,通常包括以下步骤: 1. **文件分块**:根据文件大小确定需要的线程数,并计算每个线程负责下载的数据范围。 2. **创建下载线程**:为每个数据块创建一个下载线程,每个线程负责下载其...
通过分析和学习这些代码,学生可以深入理解Android多线程下载的工作原理,并能应用于实际项目中。 总的来说,Android多线程断点下载涉及到Android的多线程编程、网络通信、数据库操作、服务管理和用户界面交互等多...