`
HUYIZIZHEN
  • 浏览: 115823 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java实现多线程下载

    博客分类:
  • java
阅读更多
package my;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;


public class MultiThreadDownload {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String path = "http://blog.liuhongwei.cn/wp-content/uploads/2009/08/java-duke-guitar.png";
		try {
			new MultiThreadDownload().downLoad(path, 5);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void downLoad(String path,int threadSize) throws IOException{
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(6000);
		//get the length of file
		int fileLength = conn.getContentLength();
		//get the name of file
		String fileName = path.substring(path.lastIndexOf("/"));
		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));
System.out.println(block);
		for(int threadID=0 ; threadID < threadSize ; threadID++){
			new DownThread(url, saveFile, threadID, block).start();

		}
	}
	
	private final class DownThread extends Thread{
		
		private URL url;
		private File saveFile;
		private int threadID;
		private int block;
		
		public DownThread(URL url, File saveFile, int threadID, int block) {
			this.url = url;
			this.saveFile = saveFile;
			this.threadID = threadID;
			this.block = block;
		}
		
		@Override
		public void run() {
			try {
				//System.out.println("threadID = "+threadID+" 已启动!");
				int startPosition = threadID * block;
				int endPosition = (threadID +1)* block-1;
				
				RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
				accessFile.seek(startPosition);
				
				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
				
				conn.setRequestMethod("GET");
				conn.setConnectTimeout(6000);
				conn.setRequestProperty("Range", "bytes="+startPosition+"-"+endPosition);
				
				BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
				bis.mark(startPosition);
System.out.println("threadID = "+threadID+" 已启动!"+startPosition);
				byte[] buffer = new byte[1024];
				int len = 0;
				while((len=bis.read(buffer))!=-1){
					accessFile.write(buffer, 0, len);
				}
				bis.close();
				accessFile.close();
//输出信息:
System.out.println("threadID = "+threadID+" 已下载完成!");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
		
	}
}

分享到:
评论

相关推荐

    Java实现多线程下载源代码

    本项目"Java实现多线程下载源代码"正是这样一个示例,它使用了NetBeans IDE创建用户界面,使得用户能够更加直观地管理和监控下载过程。 首先,我们来深入理解Java中的多线程。在Java中,线程是程序执行的最小单位,...

    java实现多线程下载代码

    java实现多线程下载,控制台实时输出下载进度,对于学习多线程与网络有一定的帮助

    java实现多线程下载文件

    在Java编程中,多线程下载文件是一种优化大文件下载速度和效率的技术。它通过将一个大文件分割成多个小部分,然后同时启动多个线程分别下载这些部分,从而达到加速下载的效果。以下是对这个主题的详细解释: 1. **...

    Java实现多线程下载和断点续传

    1. 把每个下载文件切成若干个块...2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以实现多线程下载 详细看这里 http://blog.csdn.net/maoxiang/archive/2010/04/02/5446293.aspx

    Java实现多线程下载

    使用Java编写的多线程下载程序!! 对才学习Java的初学者肯定会有帮助的!!

    一个用JAVA实现多线程下载的应用程序和源代码!

    在Java编程领域,多线程下载是一个常见的技术实践...这个Java实现的多线程下载程序是学习并发编程和网络I/O的一个良好实例,通过对源代码的研究,开发者可以了解如何在实际项目中有效地使用Java的并发特性来提高性能。

    Java实现多线程下载JAR包

    用NetBeans编的一个Java多线程下载程序,这只是一个JAR包,大家可以感受下哈!

    java 多线程下载 (单文件)

    4. **Java实现多线程下载的关键类与方法**: - `Thread` 类或 `Runnable` 接口:用于创建和管理线程。 - `ExecutorService` 和 `ThreadPoolExecutor`:提供线程池服务,管理线程的创建和销毁,避免频繁创建销毁...

    duoxianchengxiazai.rar_Java 多线程 下载_java 多线程下载

    在标题"duoxianchengxiazai.rar_Java 多线程 下载_java 多线程下载"中,我们可以看出这是一个关于Java实现多线程下载的示例代码或教程。 描述提到"多线程下载,随便做的,有一定的局限性,仅供参考",这意味着提供...

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    java实现多线程文件传输

    本篇文章将深入探讨如何使用Java实现多线程文件传输,并涵盖以下几个关键知识点: 1. **线程基础**:在Java中,线程是程序执行的基本单元,可以通过实现`Runnable`接口或继承`Thread`类来创建。`Runnable`接口更...

    Java 多线程下载

    **Java实现多线程下载的关键点:** 1. **文件分块**:使用`RandomAccessFile`类来处理文件的读写,可以精确地定位到文件的某一部分进行写入。 2. **线程管理**:使用`Thread`或`ExecutorService`来创建和管理下载...

    Java实现的多线程下载工具

    Java实现的多线程下载工具是一种利用Java编程语言来提高文件下载效率的技术。在传统的单线程下载方式中,文件的下载过程由一个线程执行,可能会受到网络波动、服务器响应速度等因素的影响,导致下载速度慢且不稳定。...

    Java多线程下载器

    在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O以及进度监控。 1. **线程**:在Java中,线程是程序执行的最小单位,每个线程负责一部分文件的下载任务。Java提供两种方式创建线程:...

    Java 利用多线程实现文件的分片下载

    刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...

Global site tag (gtag.js) - Google Analytics