多线程下载简单实现
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
分享到:
相关推荐
java多线程Socket简单实现
采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...
vb多线程控件能实现简单的多线程,还是有很多限制
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
全部写在一个类中,为第一次交的作业,代码有点乱,但能运行,可以实现多线程下载
基于c++,实现一个简单的多线程例子,里面包括没有共有资源的多线程,以及有公用资源的占用问题解决。
多线程方式实现简单易用的套接字,使用TCP协议 阻塞方式. 最大发送数据字节数不宜超过1KB. 同时实现了客户端及服务器端功能,可接收及发送数据. 版本: v1.0.0 第一版本发布时间: 20100823 第一作者: Jef ...
目前。...该文在7ava网络和多线程技术的基 础上,提出了一个简单而实用的文件分割算法,并据此设计开发了一个的简单实府的网络资源下栽工具.使用该下裁工具可以实现 对多种格式的网络文件的浏览和下栽
使用eclipse实现Android多线程下的简单字符串计数器
简单的网络聊天程序,用多线程实现数据接收,带详细的注释,可以给初学者学习
C#多线程实现了简单的任务管理器的功能; 是初学多线程同学的一个很好的例子,有助于进一步了解多线程;
用多线程模拟多进程实现银行家算法,或者不是最好,但是有效,程序写的较乱
Linux下用Socket和多线程实现简单聊天室
使用多线程技术,获取网页内容,可以自行修改。
java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针...
自己看着文档一步一步理解敲出来的代码。 代码很简洁,注释非常非常...使用纯 Java 实现的多线程下载。如果再配上数据库或者记录下载的进度。 就可以实现了断点下载了,但是我现在还没弄。 分享出来吧。让大家少走弯路
实现简单多线程程序(VS2010控制台程序)
java一些简单的多线程用法,适合初学者
delphi7写的简单的多线程是示例,平时开发了解使用