- 浏览: 203305 次
- 性别:
- 来自: 湖南
文章分类
最新评论
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(); } } }
发表评论
-
java版 纸牌
2012-05-30 15:43 855java 纸牌游戏,有连翻一张或三张两种玩法,程序在部分点击区 ... -
java版 推箱子
2012-01-12 17:24 1488java版 推箱子源码 import javax.swin ... -
java 基础加强
2011-01-07 14:17 758java基础 jdk1.5 新特征 ... -
网络五子棋
2011-01-05 15:50 1040最近空限,完成之前未完成的网络五子棋,它是面向TCP协 ... -
java图片处理:文字图像水印 缩放补白
2010-12-28 11:40 1159package com.util; import j ... -
Java2D绘制五星红旗
2010-12-27 09:17 1151/** 使用Java2D绘制五星红旗 五星 ... -
网络编程
2010-12-21 14:16 1228网络编程 网络编程的基础知识 网络协议与TCP/IP 计算 ... -
IO/输入输出
2010-12-21 14:14 1429IO/输入输出 File类 它是 ... -
银行业务调度系统
2010-08-19 18:34 1325模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6 ... -
交通灯管理系统
2010-08-18 13:16 1290模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异 ... -
贪吃蛇游戏
2010-08-17 08:32 1696对大多数人来说,要想自己编写出《贪吃蛇》游戏的程序 ... -
蜘蛛牌
2010-08-15 00:17 1860蜘蛛牌在朴克牌游戏当中是比较有趣的游戏,特别是闯关成功 ... -
j2se版俄罗斯方块
2009-10-21 21:22 14541.图形界面 import java.awt.*; ... -
豆子吃妖精
2009-10-19 21:30 768本程序是运用了图形化画版和多程技术,只支持固定运行轨迹, ... -
连连看
2009-10-09 20:54 1012java不易开发大型游戏,但任一语言都有是相通,本程序运 ... -
控制台五子棋
2009-08-17 20:15 915<p>这是一个控制台的五子棋,它的妙处是它算法侦听 ...
相关推荐
本文将深入探讨如何使用ASIHttpRequest库和自定义线程类来实现图片的多线程下载和显示。 首先,让我们了解什么是多线程。在iOS应用中,主线程主要负责用户界面的更新和事件响应,而其他线程则可以用于执行后台任务...
本文将深入探讨iOS中的多线程技术,包括NSOperation和GCD(Grand Central Dispatch)两种主要的实现方式,以及如何在多线程环境中进行网络图片的下载。 一、NSOperation和NSOperationQueue NSOperation是苹果提供...
而GCD则是由苹果推出的一种新的多线程编程方法,它通过利用系统的底层技术,使得多线程编程变得更为简单和高效。 GCD(Grand Central Dispatch)是iOS和OS X平台下的并发编程框架,它是一组语言特性、运行时库和...
通过使用这样的工具或类,开发者可以更方便地控制多线程任务的数量,确保系统的资源得到合理利用,避免过多的并发导致系统负担过重。 总结,iOS中的GCD提供了一种优雅的方式来管理和控制多线程任务。通过设置自定义...
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行后台任务 }); ``` **3. NSOperation & NSOperationQueue** `NSOperation` 和 `...
在iOS开发中,多线程是一项关键的技术,用于提高应用程序的执行效率和用户体验。本文将深入探讨iOS多线程的应用及线程创建方法,主要基于传统的Objective-C编程语言。 首先,我们要了解进程与线程的概念。进程是...
在iOS应用开发中,多线程是一个至关重要的概念,它涉及到如何在单个应用程序中同时执行多个任务,提高用户体验和程序效率。这个压缩包“多线程_IOS应用源码.rar”很可能包含了一个实际的iOS项目,其中实现了多线程...
GCD利用系统调度器管理线程,简化了多线程编程,开发者无需直接创建和管理线程。GCD提供了队列(Dispatch Queue)的概念,主要有串行队列和并行队列两种。 1. 串行队列:队列中的任务会按照添加的顺序依次执行,...
例如,`std::atomic<int>`类型的`global_counter`、`foo`和`bar`在多线程环境下被安全地增加。然而,仅仅使用`std::atomic`并不一定能完全避免数据竞争,如示例中的`error_boot`函数所示,即使`booting`是原子的,但...
dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(imageDownloadQueue, ^{ // 图片下载逻辑 }); ``` - **优点**:GCD的一个重要优点...
GCD(Grand Central Dispatch)是Apple提供的一种强大的多线程解决方案,适用于iOS和Mac OS X系统。本教程通过"GCDDemo"项目,将详细介绍如何利用GCD进行iOS多线程编程,并展示其与Block的结合使用,以提升代码的...
在iOS应用开发中,多线程是一个至关重要的概念,它涉及到如何高效地管理应用程序的执行流程,提升用户体验,以及优化资源使用。标题“ios应用源码之多线程 2018127”表明这是一份关于2018年12月7日时的iOS应用开发源...
还可以使用dispatch_get_global_queue获取全局并行队列,一般传入DISPATCH_QUEUE_PRIORITY_DEFAULT作为优先级。 任务的创建方法有: - 使用dispatch_sync同步执行任务。 - 使用dispatch_async异步执行任务。 示例...
在iOS开发中,异步线程下载图片是一个常见的任务,特别是在构建用户界面时,为了提供流畅的用户体验,我们需要在后台线程中加载和处理图片,而不是阻塞主线程。GCD(Grand Central Dispatch)是Apple引入的一个强大...
### iOS GCD 多线程知识点详解 #### 一、概览 在iOS开发中,为了提高应用程序的响应性和性能,通常会采用多线程技术。Grand Central Dispatch(简称GCD)是苹果提供的一个高性能的多线程机制,用于简化多线程编程...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行异步任务 }); ``` #### 本地队列 本地队列则是开发者自己创建的队列,用于管理特定任务: ```objective-c dispatch_...
**iOS GCD 多线程详解** 在iOS开发中,多线程技术是不可或缺的一部分,它使得应用程序可以同时处理多个任务,提升用户体验。GCD(Grand Central Dispatch)是Apple为解决多核处理器环境下并发问题而引入的一个强大...
在iOS开发中,多线程技术是不可或缺的一部分,它能够帮助开发者提高应用程序的性能和响应速度,尤其是在处理耗时操作时。多线程允许代码在不同的执行路径上同时运行,从而实现并行处理任务。 首先,我们要理解进程...
在iOS开发中,多线程实现多图片下载是常见的需求,尤其在处理用户界面更新时,需要避免阻塞主线程,提高用户体验。本篇文章将详细讲解如何在iOS中使用多线程技术下载并存储网络图片。 首先,我们需要了解基本的数据...
在iOS和Mac开发中,Cocoa框架提供了强大的多线程编程支持,让我们能够高效地处理复杂的并发任务。本文将深入探讨Cocoa中的多线程编程,特别是如何利用block(闭包)和dispatch queue(调度队列)来实现线程间的协调...