`

Globle Get 多线程下载系统

    博客分类:
  • J2SE
阅读更多

GlobalGet”是实现HTTP协议和FTP协议的多线程下载工具。目前公司承担其测试版本的开发。该工具需要具备多线程分段下载的功能,同时还应实现“断点续传”功能。后续的版本还将增加下载资料管理的功能 。

运行效果如下:


实现代码:
package org.nitpro.demo;

import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadUtil {
	
	public int getFileLength(String url) throws Exception{
		int length = 0;
		URL downladURL = new URL(url);
		HttpURLConnection con = (HttpURLConnection) downladURL.openConnection();
		
		int stateCode = con.getResponseCode();
		if (stateCode != 200) {
			length =  -1;
		}
		
		int size = con.getContentLength();
		con.disconnect();
		length = size;
		return length;
	}
	
	public boolean isFinished(boolean[] isStop){
		boolean isFinished = false;
		for(int i=0;i<isStop.length;){
			boolean flag = isStop[i];
			if(!flag){
				try{
					Thread.sleep(3000);
				}catch(Exception e){
					e.printStackTrace();
				}
				isFinished = false;
			}else{
				isFinished = true;
				i++;
			}
		}
		return true;
	}
	
}

package org.nitpro.demo;

public class DownloadInfo {
	String url;
	int threadNum;
	String filename;
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}
	public int getThreadNum() {
		return threadNum;
	}
	public void setThreadNum(int threadNum) {
		this.threadNum = threadNum;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	
}


package org.nitpro.demo;

import java.util.List;
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;

public class MultiDownload {
	int i=0;
	int fileMark = 0;
	DownloadUtil downUtil = new DownloadUtil();
	boolean isStop[] = new boolean[10];
	
	
	public void downProcess(String url,int byteCount,int threadNum) throws Exception{
		while(i<threadNum){
			final int startPosition = byteCount*i;
			final int endPosition = byteCount*(i+1);
			
			File file = new File("temp_file_"+i+".temp");
			DownThread fileThread = new DownThread(url,file,
					startPosition,endPosition,this,i);
			new Thread(fileThread).start();
			i++;
		}
	}
	
	
	public void downMulitFile(List downList) throws Exception{
		for(int k=0;k<downList.size();k++){
			DownloadInfo downInfo = (DownloadInfo)downList.get(i);
			String url = downInfo.getUrl();
			int threadNum = downInfo.getThreadNum();
			String filename = downInfo.getFilename();
			int fileLength  = downUtil.getFileLength(url);
			
			if(fileLength!=-1){
				final int byteCount = (int)(fileLength/threadNum)+1;
				boolean stopFlag = true;			
				downProcess(url,byteCount,threadNum);			
				stopFlag = downUtil.isFinished(isStop);		
				if(stopFlag){
					File file = new File(filename);
					uniteFile(threadNum,file);
				}
			}		
		}
	}
	
	
	public void uniteFile(int threadNum,File file) throws Exception{
		for(int i=0;i<threadNum;i++){
			File tempfile = new File("temp_file_"+i+".temp");
			FileInputStream fis = new FileInputStream(tempfile);
			RandomAccessFile raf = new RandomAccessFile(file, "rw");
			byte[] buf = new byte[1024];
			int len = -1;
			raf.seek((long) fileMark);
			
			while ((len = fis.read(buf)) != -1) {
				raf.write(buf, 0, len);
				fileMark += len;
			}
			
			fis.close();
			raf.close();
			tempfile.delete();
		}
	}
}


package org.nitpro.demo;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownThread implements Runnable{
	String url = "";
	File file;
	int startPosition;
	int endPosition;
	MultiDownload down;
	int i;
	
	public DownThread(String url,File file,int startPosition,int endPosition,MultiDownload down,int i){
		this.url = url;
		this.file = file;
		this.startPosition = startPosition;
		this.endPosition = endPosition;
		this.down = down;
		this.i = i;
	}
	
	public void run(){
		try{
			URL downUrl = new URL(url);
			HttpURLConnection connection = (HttpURLConnection)downUrl.openConnection();
			InputStream is = connection.getInputStream();
			BufferedInputStream bis = new BufferedInputStream(is);
			
			FileOutputStream out = new FileOutputStream(file);
			byte buf[] = new byte[1024];
			int size = -1;
			int count = 0;
			bis.skip(startPosition+1);
			while ((size = bis.read(buf, 0, 1024)) > 0) {
				if ((startPosition + size) >= endPosition)
					size = endPosition - startPosition;
				out.write(buf, 0, size);
				startPosition += size;
				count += size;
			}
			bis.close();
			out.close();
			connection.disconnect();
		}catch(Exception e){
			e.printStackTrace();
		}
		down.isStop[i] = true;
	}
}

package org.nitpro.demo;

import java.util.ArrayList;
import java.util.List;

public class Demo {
	
	public void start() throws Exception{
		MultiDownload down = new MultiDownload();
		String url = "http://www.ytblog.net/blog_musfile/823996700.mp3 ";
		int threadNum = 3;
		String filename = "save_as_filename.mp3";
		
		DownloadInfo info = new DownloadInfo();
		info.setUrl(url);
		info.setThreadNum(threadNum);
		info.setFilename(filename);
		
		List downlist = new ArrayList();
		downlist.add(info);
		down.downMulitFile(downlist);
	}
	
	
	public static void main(String[] args){
		try{
			Demo demo = new Demo();
			demo.start();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
  • 大小: 12.3 KB
分享到:
评论

相关推荐

    ios 多线程下载图片并显示

    本文将深入探讨如何使用ASIHttpRequest库和自定义线程类来实现图片的多线程下载和显示。 首先,让我们了解什么是多线程。在iOS应用中,主线程主要负责用户界面的更新和事件响应,而其他线程则可以用于执行后台任务...

    ios 开发多线程

    本文将深入探讨iOS中的多线程技术,包括NSOperation和GCD(Grand Central Dispatch)两种主要的实现方式,以及如何在多线程环境中进行网络图片的下载。 一、NSOperation和NSOperationQueue NSOperation是苹果提供...

    Cocoa多线程开发Objective-C详解

    而GCD则是由苹果推出的一种新的多线程编程方法,它通过利用系统的底层技术,使得多线程编程变得更为简单和高效。 GCD(Grand Central Dispatch)是iOS和OS X平台下的并发编程框架,它是一组语言特性、运行时库和...

    iOS控制多线程任务数量

    通过使用这样的工具或类,开发者可以更方便地控制多线程任务的数量,确保系统的资源得到合理利用,避免过多的并发导致系统负担过重。 总结,iOS中的GCD提供了一种优雅的方式来管理和控制多线程任务。通过设置自定义...

    iphone多线程编程

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行后台任务 }); ``` **3. NSOperation & NSOperationQueue** `NSOperation` 和 `...

    理解iOS多线程应用的开发以及线程的创建方法

    在iOS开发中,多线程是一项关键的技术,用于提高应用程序的执行效率和用户体验。本文将深入探讨iOS多线程的应用及线程创建方法,主要基于传统的Objective-C编程语言。 首先,我们要了解进程与线程的概念。进程是...

    多线程_IOS应用源码.rar

    在iOS应用开发中,多线程是一个至关重要的概念,它涉及到如何在单个应用程序中同时执行多个任务,提高用户体验和程序效率。这个压缩包“多线程_IOS应用源码.rar”很可能包含了一个实际的iOS项目,其中实现了多线程...

    IOS应用源码之多线程编程.zip

    GCD利用系统调度器管理线程,简化了多线程编程,开发者无需直接创建和管理线程。GCD提供了队列(Dispatch Queue)的概念,主要有串行队列和并行队列两种。 1. 串行队列:队列中的任务会按照添加的顺序依次执行,...

    C++多线程编程介绍,技巧及注意要点.pptx

    例如,`std::atomic&lt;int&gt;`类型的`global_counter`、`foo`和`bar`在多线程环境下被安全地增加。然而,仅仅使用`std::atomic`并不一定能完全避免数据竞争,如示例中的`error_boot`函数所示,即使`booting`是原子的,但...

    iOS中多线程原理与runloop介绍

    dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(imageDownloadQueue, ^{ // 图片下载逻辑 }); ``` - **优点**:GCD的一个重要优点...

    GCD多线程_demo

    GCD(Grand Central Dispatch)是Apple提供的一种强大的多线程解决方案,适用于iOS和Mac OS X系统。本教程通过"GCDDemo"项目,将详细介绍如何利用GCD进行iOS多线程编程,并展示其与Block的结合使用,以提升代码的...

    ios应用源码之多线程 2018127

    在iOS应用开发中,多线程是一个至关重要的概念,它涉及到如何高效地管理应用程序的执行流程,提升用户体验,以及优化资源使用。标题“ios应用源码之多线程 2018127”表明这是一份关于2018年12月7日时的iOS应用开发源...

    iOS 多线程总结之GCD的使用详解

    还可以使用dispatch_get_global_queue获取全局并行队列,一般传入DISPATCH_QUEUE_PRIORITY_DEFAULT作为优先级。 任务的创建方法有: - 使用dispatch_sync同步执行任务。 - 使用dispatch_async异步执行任务。 示例...

    OC-GCD异步线程下载图片

    在iOS开发中,异步线程下载图片是一个常见的任务,特别是在构建用户界面时,为了提供流畅的用户体验,我们需要在后台线程中加载和处理图片,而不是阻塞主线程。GCD(Grand Central Dispatch)是Apple引入的一个强大...

    iOS GCD 多线程

    ### iOS GCD 多线程知识点详解 #### 一、概览 在iOS开发中,为了提高应用程序的响应性和性能,通常会采用多线程技术。Grand Central Dispatch(简称GCD)是苹果提供的一个高性能的多线程机制,用于简化多线程编程...

    iOS多线程简单介绍

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行异步任务 }); ``` #### 本地队列 本地队列则是开发者自己创建的队列,用于管理特定任务: ```objective-c dispatch_...

    IOS GCD 多线程

    **iOS GCD 多线程详解** 在iOS开发中,多线程技术是不可或缺的一部分,它使得应用程序可以同时处理多个任务,提升用户体验。GCD(Grand Central Dispatch)是Apple为解决多核处理器环境下并发问题而引入的一个强大...

    多线程技术在iOS开发中的使用.doc

    在iOS开发中,多线程技术是不可或缺的一部分,它能够帮助开发者提高应用程序的性能和响应速度,尤其是在处理耗时操作时。多线程允许代码在不同的执行路径上同时运行,从而实现并行处理任务。 首先,我们要理解进程...

    IOS多线程实现多图片下载(一)

    在iOS开发中,多线程实现多图片下载是常见的需求,尤其在处理用户界面更新时,需要避免阻塞主线程,提高用户体验。本篇文章将详细讲解如何在iOS中使用多线程技术下载并存储网络图片。 首先,我们需要了解基本的数据...

    Cocoa多线程编程之 block 与 dispatch quene

    在iOS和Mac开发中,Cocoa框架提供了强大的多线程编程支持,让我们能够高效地处理复杂的并发任务。本文将深入探讨Cocoa中的多线程编程,特别是如何利用block(闭包)和dispatch queue(调度队列)来实现线程间的协调...

Global site tag (gtag.js) - Google Analytics