多线程下载简单实现
1、多线程下载原理
将网络上待下载的文件,划分为几段,然后对应开几条线程分别对应划分好的段,分别进行下载。如下图:
2、多线程文件下载注意点
这里主要还是分段需注意下起始位置和终止位置。这里我们的处理是:
先取出文件的大小:size = con.getContentLength();然后再进行下面分段的长度测量:int block = size%threadNum==0?size/threadNum:size/threadNum+1;这样我们保证分成的几段长度加起来大于或等于待下载文件的长度。
下面是代码:package org.hwq.multhreaddownload;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class MulThreadDownload2 {
//开启的线程数
public static final int threadNum = 3;
public void download() throws IOException{
//下载文件的网络路径
URL url = new URL("http://localhost:8080/Thunder.exe");
//打开网络连接
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//获取待下载文件的大小
int remoteFileSize = con.getContentLength();
//定义下载完成后保存的文件
RandomAccessFile file = new RandomAccessFile("d:\\Thunder.exe","rwd");
//将文件的长度设置成待下载文件的大小
file.setLength(remoteFileSize);
//将待下载文件分段
int block = remoteFileSize%threadNum==0?remoteFileSize/threadNum:remoteFileSize/threadNum+1;
//启动线程,开始下载
for(int i=0;i<threadNum;i++){
new MyThread(block*i,block,"d:\\Thunder.exe",url).start();
}
}
class MyThread extends Thread{
URL url;//待下载文件路径
int start;//下载开始点
int block;//分段的长度
RandomAccessFile file;//下载后保存的文件
MyThread(int start,int block,String file,URL url) throws FileNotFoundException{
this.start = start;
this.block = block;
//这个地方需注意,必须让每条线程,独立开启文件,不然对同一个文件进行操作,会出导致出错
this.file = new RandomAccessFile(file,"rwd");
this.url = url;
}
public void run(){
try {
//重新分别打开下载路径
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
//获取分段后要下载的数据
con.setRequestProperty("Range", "bytes=" + start + "-" + (start+block-1));
//获取待下载文件输入流
InputStream in = con.getInputStream();
//缓冲区
byte[] b = new byte[1024];
int len = -1;
//将保存文件开始下载起点移到同待下载文件读取数据的起始点(不设置会出问题)
file.seek(start);
while((len = in.read(b))!=-1){
//将下载的数据写入保存文件
file.write(b, 0, len);
}
//关闭文件
file.close();
//关闭输入流
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
MulThreadDownload2 d = new MulThreadDownload2();
d.download();
}
}
过程中很悲催的不知道这个方法:
con.setRequestProperty("Range", "bytes=" + start + "-" + (start+block-1));
可以获得远程文件分段,结果自己写了个(其实是仿照InputStream源码的skip()方法),记录下来:int block = size%threadNum==0?size/threadNum:size/threadNum+1;
public int read(InputStream in,byte[] b){
try{
if(block==0)
return -1;
int c = in.read();
if(c == -1)
return -1;
block--;
b[0] = (byte) c;
int i = 1;
for(;i<b.length&&block>0;i++){
c = in.read();
if(c == -1)
break;
block--;
b[i] = (byte) c;
}
return i;
}catch (Exception e) {
e.printStackTrace();
}
return -1;
}
最后,有几个点不明白:
HttpURLConnection,URLConnection中的下面方法看不懂,希望有懂得的朋友讲解下:public String getHeaderField(String name) {
return null;
}
public String getHeaderFieldKey(int n) {
return null;
}
public String getHeaderField(int n) {
return null;
}
.......
为什么直接返回null了。但是程序还能执行下去。小弟实在不解啊。

- 大小: 6.6 KB
分享到:
相关推荐
本文将深入探讨如何在C#中实现多线程下载文件,涉及的知识点包括线程池、异步编程、进度更新以及错误处理。 首先,我们需要了解线程的基本概念。在C#中,线程是程序执行的独立路径,每个线程都有自己的调用堆栈,...
在C#编程中,实现一个支持断点续传和多线程下载的HTTP Web客户端工具类是一项复杂但实用的任务。断点续传允许用户在下载过程中中断,然后在稍后的时间点继续下载,而不会丢失已下载的数据。多线程下载则能显著提高大...
在C# Winform应用中实现多线程下载是一项常见的任务,尤其在处理大文件或需要提高下载速度的情况下。本文将详细讲解如何利用C#的多线程技术来创建一个Winform应用程序,实现高效的文件下载功能。 首先,我们需要...
本篇文章将详细探讨如何在Android中实现多线程下载功能,并涉及断点续传技术,以确保下载的高效性和可靠性。我们还将提及提供的`demo.apk`,这是一个实际的演示应用,可供开发者直接安装体验。 ### 一、多线程下载...
本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的基础。以下是关于这个主题的详细知识点: 1. **多线程的概念**:多线程是指在一个程序中同时执行多个不同的线程,每个...
【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...
- 提供一个简单的多线程下载框架的伪代码: ```java class DownloadTask implements Runnable { private int start; // 下载起始位置 private int end; // 下载结束位置 private String url; private File ...
本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个示例来源于一个CSDN博客,通过访问提供的链接...
采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...
随着网络技术的发展,下载技术也不断进步,从最初简单的单线程下载到现在的多线程下载和断点续传。本文将探讨多线程下载工具的实现原理和技术细节。 首先,传统的单线程下载方式存在一个显著问题,即网络连接不稳定...
VB多线程控件是开发者用来实现这一功能的一种工具,但正如标题和描述所指出的,虽然可以实现简单的多线程,但确实存在一些限制和挑战。 首先,我们要理解什么是线程。线程是程序执行的基本单元,每个线程都有自己的...
在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
但是,可以结合外部工具如 `axel` 或 `aria2` 实现多线程下载。比如使用 `aria2c`: ```bash aria2c -x 5 -j 5 http://example.com/file.zip ``` 这里 `-x` 指定下载时的连接数,`-j` 指定同时进行的任务数。请...
这使得在PB应用中实现多线程变得更加简单。在PB12.5中,还可以利用ThreadPool类来管理和调度多个线程,从而更有效地利用系统资源。 三、PB.NET的多线程实现 PB.NET是PB向.NET框架的转型产品,它完全融入了.NET的...
传统的VB6环境虽然能够进行简单的文件下载任务,但在多文件同时下载或多线程处理方面存在一定的局限性。根据描述中的内容,使用VB6实现多文件同时下载时遇到了困难,主要表现在无法实现真正意义上的多线程下载。 ##...
下面将详细解释多线程和多任务下载的概念,以及如何在易语言中实现这些功能。 1. **多线程技术**:在计算机科学中,多线程是指在一个程序中同时运行多个独立的执行路径,每个路径称为一个线程。在下载软件中,多...
这些功能的实现进一步增强了多线程下载的实用性和可靠性。 总的来说,多线程下载结合了线程池和HTTP通信的技术,通过并发处理实现了高效的大文件下载。理解和掌握这些知识点对于优化网络应用的性能至关重要。