码迷,mamicode.com
首页 > 编程语言 > 详细

java实现多线程下载

时间:2015-03-09 22:34:39      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:多线程   randomaccessfile   http   下载   序列化   

本篇博客可认为是对 使用java实现http多线程下载 一文的再次解读。

首先,从宏观来说
java实现多线程下载这个功能的实现由以下几部分组成:

1 建立多个线程去分别下载文件的一部分。
2 将多个线程下载的文件(还在内存中),写入硬盘中的一个文件。
3 断点续传


GET /Path/FileName HTTP/1.0
Host: www.server.com:80
Accept: */*
User-Agent: GeneralDownloadApplication
Connection: close

这就是一个request请求

例如host,accept都是request请求的字段部分(关于ruquest的详尽信息 可参考 HTTP深入浅出 http请求


首先我们说第一点:
如果某个文件有1000字节
在request的字段部分里,加入Range
Range: bytes=500-      表示读取该文件的500-999字节,共500字节。
Range: bytes=500-599   表示读取该文件的500-599字节,共100字节。

这样第一个问题就算是解决了。

这里其实还有一个小问题
如果一个文件大小为123kB
用10个线程下载
怎么办? 123除以10 除不尽呀。
咱们可以让 前9个线程都下载12KB数据
第10个线程下载15KB 不就OK了!!
这部分代码怎么写?自己看着办。

第二个问题牵扯到,在一个文件中的给定位置写数据。
有这个一个类: RandomAccessFile
Random 随机
Access 访问
这个类大家猜一猜,都知道就是随机访问文件的。
我们看看它的几个方法。
public native void seek(long pos) throws IOException

     * @param      b     the data.
     * @param      off   the start offset in the data.
     * @param      len   the number of bytes to write.
     * @exception  IOException  if an I/O error occurs.
public void write(byte b[], int off, int len) throws IOException
第一个方法就是定位,pos就是文件的某一个位置。
第二个方法就是.. 自己看说明吧。
关于RandomAccessFile的例子大家参考 Java RandomAccessFile用法


那第三个问题如何解决呢?
系统中有一个类是:DLTask,代表一个下载任务(一个下载任务里面会通过多个线程来下载那一个文件)
系统中会有一个单独的线程来监控下载任务,每隔3秒,就会把下载任务(java类)序列化的硬盘上。
这样一来即使在下载未完成时,终止下载。下一次,我们依然可以通过反序列化得到原先的下载任务。(关于序列化的知识 请参看 Java基础学习总结——Java对象的序列化和反序列化
同时那个专门监控下载任务的进程还可以统计下载速率。



参考资料
http://www.cnblogs.com/rqnet/p/4319587.html
http://calmness.iteye.com/blog/220075
http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html
http://blog.csdn.net/akon_vm/article/details/7429245
http://www.cnblogs.com/xdp-gacl/p/3777987.html

java实现多线程下载

标签:多线程   randomaccessfile   http   下载   序列化   

原文地址:http://blog.csdn.net/dlf123321/article/details/44160045

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!