java实现多线程下载

本篇博客可认为是对 使用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

时间: 2024-12-28 01:59:47

java实现多线程下载的相关文章

Java之多线程下载

多线程下载的原理在于,每个线程下载文件的一部分,每个线程将自己下载的一部分写入文件中它应该的位置,所有线程下载完成时,文件下载完成.其关键点在于:RandomAccessFile.seek(beginIndex)和URLConnection.setRequestProperty("Range", "bytes=" + beginIndex + "-" + endIndex). 转载请注明原创地址,请尊重原创,谢谢. 代码如下,以下代码copy后可

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

开三个线程下载,代码: package demo; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MutilDownLoad { // 放在Tomcat下的一个文件 static String path = "http://192.168.87.1:8080/lol.exe"

Java实现多线程下载 URL以及URLConnection

主线程: public class MultiThreadDown { public static void main(String[] args) throws Exception{ //初始化Downutil对象 final DownUtil downutil = new DownUtil("http://www.crazyit.org/" +"attachment.PHP?aid=MTY0NXxjNjBIYznjN3wxMzE1NTQ2MjU5fGNho" +

java中多线程下载

package com.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MutileThreadDown { private static int blockCount=3; private static int blockS

Java之多线程断点下载的实现

RandomAccessFile类: 此类的实例支持对随机訪问文件的读取和写入.随机訪问文件的行为相似存储在文件系统中的一个大型 byte 数组. 存在指向该隐含数组.光标或索引,称为文件指针.输入操作从文件指针開始读取字节.并随着对字节的读取而前移此文件指针. 假设随机訪问文件以读取/写入模式创建,则输出操作也可用.输出操作从文件指针開始写入字节.并随着对字节的写入而前移此文件指针.写入隐含数组的当前末尾之后的输出操作导致该数组扩展.该文件指针能够通过 getFilePointer 方法读取.

java多线程下载

多线程下载是通过占有服务器资源来提高速度的.每个线程应该下载一个文件的不同位置,假如现在有一个长度为10的资源,有三个线程,那么第一个线程下载的长度为012,第二个为345,第四个为6789所以问题来了每个线程下载的长度是多少呢?线程的id为0,1,2每个线程下载的数量=总长度/线程数量size=10/3start:id*sizeend:(id+1)*size-1最后一个线程的结束位置为:总长度-1 package down; import java.io.File; import java.i

java 多线程下载功能

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Demo { private static int threadCount = 3; /** * 多线程下载测试类 * @param args * @throws Exception */ public static void main(S

测试多线程下载的java类

多线程下载的基础类,类似于迅雷,qq旋风等下载器一样的原理 package com.shenzhen.mutiledownload2014; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /** * 测试多线程下载的样例 * * @author mayubao * */ public class TestDow

Java 仿迅雷多线程下载

package net.webjoy.jackluo.android_json; /** * 1.http Range "bytes="+ start+end * 2.RandomAccessFile设置写入的位置 * 3开启多线程下载 * * Created by jackluo on 9/30/15. */ import android.os.Environment; import android.os.Handler; import android.os.Message; imp