欢迎来到天天文库
浏览记录
ID:47655687
大小:400.79 KB
页数:28页
时间:2019-10-17
《基于Java多线程的下载器源码剖析文库》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于Java多线程的下载器源码剖析(一)分类:Java多线程2012-04-2821:29747人阅读评论(6)收藏举报多线#呈iavadownloadbytefileexception目录⑵[±]本文实现了一个基于Java多线程的下载器,可提供的功能有:1.对文件使用多线程下载,并显示每时刻的下载速度。2.对多个下载进行管理,包括线程调度,内存管理等。这篇文章的结构如门首先讨论如何实现利用Java多线程对单个文件进行卜•载。然后讨论当系统中有多个文件下载,如何对这些下载进行管理。包括线程调度,内存管理等。-:单个文件下载的管理1
2、.单文件下载类层次首先简要介绍一下单个文件下载管理的类层次:来一张图来表不。Download保存文件File•为需要下载的文件创建一个Download类,Download负责管理该文件下载时的线程管理、文件管理、当前速度计算等操作。•根据线程的数HtNum,将该文件分为tNum段,每段为一个DownloadBlocku在实际下载的过程屮,并不是一次把所有的东西下载完,而是每次下载固定size的一段Di。所以每个DownloadBlock乂会分成n段。•为每个DownloadBlock申请一个线程DownloadThreado其主要
3、作用就是每次下载一段Di,并将其写入到文件中。1.单文件下载对于单个下载,步骤如下•连接资源服务器,获取资源信息,创建文件•切分资源,为每个线程分配固定的下载区域。1)封装下载的属性在建立下载Z前,我们把每一次下载进行抽彖封装。首先把URL、目标文件等封装在一个DownloadConfig类屮。其屮包含了4个属性:[java]viewplaincopy•privateURLurl;//文件下载地址•privateFilefile;//卜■载文件保存Fl标文件•privateintnthread;//卜谶该文件需要的线程数•priv
4、ateintpriority;//该卜墩的优先级如下如所示:2)连接资源服务器,获取资源信息,创建文件,并指定文件大小[java]viewDlaincoov•length=config.getUrl().openConnection().getContentLength();•RandomAccessFilefile=newRandomAccessFile(config.getFile(),"rw");•file.setLength(length);•file.close();2)切分资源,为每个线程分配固定的下载区域,并将当前的
5、下载加入到队列中[java]viewplaincopy•intsize=length/config.getNthread();•for(inti=0;i6、步骤如下:1•创建缓存,创建连接。设置获取资源数据的范围,创建文件,并设置写入位置[java]viewplaincopy•//创建缓存•byte[]b;•if(block.getLength()7、operty(''Range,,bytes="+block.getStart()++block.getStart()+block•getLength()-1);•RandomAccessFilefile=newRandomAccessFile(block.getDownload().getConfig().getFile(),"rw");//创建RandomAccessFile•file,seek(block.getStart());//从startPos开始写入2.如果当前block的length大于0,则从URL资源处获取固定8、大小的资源,并将其写入到文件中。3•更新block块的start,以及length,如果length大于0,继续进行2,否则则表示当前block已经下载完毕,退出该线程。[java]viewDlaincoov•InputStreamin二block
6、步骤如下:1•创建缓存,创建连接。设置获取资源数据的范围,创建文件,并设置写入位置[java]viewplaincopy•//创建缓存•byte[]b;•if(block.getLength()7、operty(''Range,,bytes="+block.getStart()++block.getStart()+block•getLength()-1);•RandomAccessFilefile=newRandomAccessFile(block.getDownload().getConfig().getFile(),"rw");//创建RandomAccessFile•file,seek(block.getStart());//从startPos开始写入2.如果当前block的length大于0,则从URL资源处获取固定8、大小的资源,并将其写入到文件中。3•更新block块的start,以及length,如果length大于0,继续进行2,否则则表示当前block已经下载完毕,退出该线程。[java]viewDlaincoov•InputStreamin二block
7、operty(''Range,,bytes="+block.getStart()++block.getStart()+block•getLength()-1);•RandomAccessFilefile=newRandomAccessFile(block.getDownload().getConfig().getFile(),"rw");//创建RandomAccessFile•file,seek(block.getStart());//从startPos开始写入2.如果当前block的length大于0,则从URL资源处获取固定
8、大小的资源,并将其写入到文件中。3•更新block块的start,以及length,如果length大于0,继续进行2,否则则表示当前block已经下载完毕,退出该线程。[java]viewDlaincoov•InputStreamin二block
此文档下载收益归作者所有