`

多线程下载简单实现

 
阅读更多
多线程下载简单实现


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
分享到:
评论
2 楼 uuubd 2012-06-18  
listen1984 写道
HttpURLConnection是个abstract class,真正调用的是URLConnection中的方法。

另外千万不要用skip那个办法,那样的话不会节省时间,反而增加下载所需时间。

listen1984 写道
HttpURLConnection是个abstract class,真正调用的是URLConnection中的方法。

另外千万不要用skip那个办法,那样的话不会节省时间,反而增加下载所需时间。

这个有什么原因吗?想知道下。
1 楼 listen1984 2012-06-14  
HttpURLConnection是个abstract class,真正调用的是URLConnection中的方法。

另外千万不要用skip那个办法,那样的话不会节省时间,反而增加下载所需时间。

相关推荐

    C#实现多线程下载文件

    本文将深入探讨如何在C#中实现多线程下载文件,涉及的知识点包括线程池、异步编程、进度更新以及错误处理。 首先,我们需要了解线程的基本概念。在C#中,线程是程序执行的独立路径,每个线程都有自己的调用堆栈,...

    C#实现支持断点续传多线程下载客户端工具类

    在C#编程中,实现一个支持断点续传和多线程下载的HTTP Web客户端工具类是一项复杂但实用的任务。断点续传允许用户在下载过程中中断,然后在稍后的时间点继续下载,而不会丢失已下载的数据。多线程下载则能显著提高大...

    C# Winform 多线程下载

    在C# Winform应用中实现多线程下载是一项常见的任务,尤其在处理大文件或需要提高下载速度的情况下。本文将详细讲解如何利用C#的多线程技术来创建一个Winform应用程序,实现高效的文件下载功能。 首先,我们需要...

    Android多线程下载实现方案

    本篇文章将详细探讨如何在Android中实现多线程下载功能,并涉及断点续传技术,以确保下载的高效性和可靠性。我们还将提及提供的`demo.apk`,这是一个实际的演示应用,可供开发者直接安装体验。 ### 一、多线程下载...

    多线程基础与基于多线程的简单聊天室

    本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的基础。以下是关于这个主题的详细知识点: 1. **多线程的概念**:多线程是指在一个程序中同时执行多个不同的线程,每个...

    java多线程简单下载器

    【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...

    java实现多线程下载

    - 提供一个简单的多线程下载框架的伪代码: ```java class DownloadTask implements Runnable { private int start; // 下载起始位置 private int end; // 下载结束位置 private String url; private File ...

    Android 多线程下载简单demo之Thread

    本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个示例来源于一个CSDN博客,通过访问提供的链接...

    (Java)FTP多线程下载源代码

    采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...

    多线程下载工具软件的实现技术分析

    随着网络技术的发展,下载技术也不断进步,从最初简单的单线程下载到现在的多线程下载和断点续传。本文将探讨多线程下载工具的实现原理和技术细节。 首先,传统的单线程下载方式存在一个显著问题,即网络连接不稳定...

    vb多线程控件能实现简单的多线程

    VB多线程控件是开发者用来实现这一功能的一种工具,但正如标题和描述所指出的,虽然可以实现简单的多线程,但确实存在一些限制和挑战。 首先,我们要理解什么是线程。线程是程序执行的基本单元,每个线程都有自己的...

    retrofit实现多线程断点下载,可暂停,开始

    在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...

    Qt 多线程及简单实例 demo

    Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...

    curl-7.37.0简单下载多线程下载断点续载范例_非常简洁

    但是,可以结合外部工具如 `axel` 或 `aria2` 实现多线程下载。比如使用 `aria2c`: ```bash aria2c -x 5 -j 5 http://example.com/file.zip ``` 这里 `-x` 指定下载时的连接数,`-j` 指定同时进行的任务数。请...

    PB多线程实现

    这使得在PB应用中实现多线程变得更加简单。在PB12.5中,还可以利用ThreadPool类来管理和调度多个线程,从而更有效地利用系统资源。 三、PB.NET的多线程实现 PB.NET是PB向.NET框架的转型产品,它完全融入了.NET的...

    VB.NET可以很容易实现多文件多线程同时下载

    传统的VB6环境虽然能够进行简单的文件下载任务,但在多文件同时下载或多线程处理方面存在一定的局限性。根据描述中的内容,使用VB6实现多文件同时下载时遇到了困难,主要表现在无法实现真正意义上的多线程下载。 ##...

    多线程多任务下载软件.zip易语言项目例子源码下载

    下面将详细解释多线程和多任务下载的概念,以及如何在易语言中实现这些功能。 1. **多线程技术**:在计算机科学中,多线程是指在一个程序中同时运行多个独立的执行路径,每个路径称为一个线程。在下载软件中,多...

    多线程下载demo

    这些功能的实现进一步增强了多线程下载的实用性和可靠性。 总的来说,多线程下载结合了线程池和HTTP通信的技术,通过并发处理实现了高效的大文件下载。理解和掌握这些知识点对于优化网络应用的性能至关重要。

Global site tag (gtag.js) - Google Analytics