用java多线程断点续传实践

annegu做了一个简单的Http多线程的下载程序,来讨论一下多线程并发下载 以及断点续传的问题。

这个程序的功能,就是可以分多个线程从目标地址上下载数据,每个线程负 责下载一部分,并可以支持断点续传和超时重连。

下载的方法是download(),它接收两个参数,分别是要下载的页面的url和编 码方式。在这个负责下载的方法中,主要分了三个步骤。第一步是用来设置断点 续传时候的一些信息的,第二步就是主要的分多线程来下载了,最后是数据的合 并。

1、多线程下载:

/** *//** http://www.bt285.cn http://www.5a520.cn
*/
public String download(String urlStr, String charset) {
     this.charset = charset;
     long contentLength = 0;
         CountDownLatch latch = new CountDownLatch (threadNum);
     long[] startPos = new long[threadNum];
     long endPos = 0;

     try {
         // 从url中获得下载的文件格式与名字
         this.fileName = urlStr.substring (urlStr.lastIndexOf("/") + 1);

         this.url = new URL(urlStr);
         URLConnection con = url.openConnection();
         setHeader(con);
         // 得到content的长度
         contentLength = con.getContentLength();
         // 把context分为threadNum段的话,每段的长度。
         this.threadLength = contentLength /  threadNum;

         // 第一步,分析已下载的临时文件,设置断点,如果是 新的下载任务,则建立目标文件。在第4点中说明。
         startPos = setThreadBreakpoint(fileDir,  fileName, contentLength, startPos);

         //第二步,分多个线程下载文件
         ExecutorService exec =  Executors.newCachedThreadPool();
         for (int i = 0; i < threadNum; i++)  {
             // 创建子线程来负责下载数据,每段数据的起 始位置为(threadLength * i + 已下载长度)
             startPos[i] += threadLength *  i;

             /**//*设置子线程的终止位置,非最后一个线程 即为(threadLength * (i + 1) - 1)
             最后一个线程的终止位置即为下载内容的长度 */
             if (i == threadNum - 1) {
                 endPos = contentLength;
             } else {
                 endPos = threadLength * (i +  1) - 1;
             }
             // 开启子线程,并执行。
             ChildThread thread = new ChildThread (this, latch, i, startPos[i], endPos);
             childThreads[i] = thread;
             exec.execute(thread);
         }

         try {
             // 等待CountdownLatch信号为0,表示所有子线 程都结束。
                 latch.await();
             exec.shutdown();

             // 第三步,把分段下载下来的临时文件中的内 容写入目标文件中。在第3点中说明。
             tempFileToTargetFile(childThreads);

         } catch (InterruptedException e) {
             e.printStackTrace();
         }
}

时间: 2024-10-06 14:50:56

用java多线程断点续传实践的相关文章

HTTP多线程断点续传下载的尝试

直接看代码吧,废话一点不多说. 功能介绍: 1 多线程HTTP下载 2 支持断点续传 3 临时文件下载,成功后改名 4 提供防盗链的破解 Java代码 1.import java.io.BufferedInputStream; 2.import java.io.BufferedWriter; 3.import java.io.File; 4.import java.io.OutputStreamWriter; 5.import java.io.RandomAccessFile; 6.import

Android编程开发实现多线程断点续传下载器实例_Android

本文实例讲述了Android编程开发实现多线程断点续传下载器.分享给大家供大家参考,具体如下: 使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点续传功能,下次启动时从记录位置继续下载,可避免重复部分的下载.这里采用数据库来记录下载的进度. 效果图:   断点续传 1.断点续传需要在下载过程中记录每条线程的下载进度 2.每次下载开始之前先读取数据库

Android实现网络多线程断点续传下载实例_Android

我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAc

java多线程分块上传 支持断点续传

问题描述 java多线程分块上传 支持断点续传 大家好,我是刚毕业的小白.今天在做上传的时候,看到公司代码有写了分块续传+断点续传方法,但是没有实现:百度了一下,还是 没有弄明白,所以请会的朋友指点一下!!!小弟在此感激不尽 解决方案 https://www.ibm.com/developerworks/cn/java/joy-down/ 解决方案二: 参考java多线程分块上传并支持断点续传最新修正完整版本代码不复杂,应该可以理解吧?

java多线程下载和断点续传

  java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class DownloadFile { /

Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制

伸缩 内容: synchronized 快速回顾 对 synchronized 的改进 比较 ReentrantLock 和 synchronized 的可伸缩性 条件变量 这不公平 结束语 参考资料 关于作者 对本文的评价 相关内容: Java 理论与实践 系列 Synchronization is not the enemy Reducing contention IBM developer kits for the Java platform (downloads) 订阅: develop

Java理论与实践: 修复Java内存模型,第1部分

活跃了将近三年的 JSR 133,近期发布了关于如何修复 Java 内存模型 (Java Memory Model, JMM)的公开建议.原始 JMM 中有几个严重缺陷,这导 致了一些难度高得惊人的概念语义,这些概念原来被认为很简单,如 volatile .final 以及 synchronized.在这一期的 Java 理论与实践 中,Brian Goetz 展示了如何加强 volatile 和 final 的语义,以修复 JMM.这些更改有些已经 集成在 JDK 1.4 中:而另一些将会包含

Java理论和实践: 安全构造技术

Java 语言提供了灵活的.看上去很简单的线程功能,使得您很容易在您的应用程序中使用多线程.然而,Java应用程序中的并发编程比看上去要复杂:在 Java 程序中,有一些微妙(也许并不是那么微妙)方式会造成数据争用(data race)以及并发问题.在这篇 Java 理论和实践中,Brian探讨了一个常见的线程方面的危险:在构造过程中,允许 this 引用逃脱(escape).这个看上去没有什么危害的做法可以在 Java 程序中造成无法可预料和不期望的结果. 测试和调试多线程程序是极其困难的,因

推荐阅读Java并发性领域编程最值得一读的力作《JAVA并发编程实践》

我的第一次之给<JAVA并发编程实践>写推荐序英文书名:Java Concurrency in Practice 中文书名:JAVA并发编程实践 这是一本入围17届Jolt大奖的书,虽然最终他没有获奖,但是这只是与政治有关的.:) 推荐序原文如下: http://book.csdn.net/bookfiles/398/10039814644.shtml 在汗牛充栋的 Java 图书堆中,关于并发性的书籍却相当稀少,然而这本书的出现,将极大地弥补了这一方面的空缺.即使并发性编程还没进入到您的 J