java的断点续传是基于之前java文件下载基础上的功能拓展

首先设置一个以线程ID为名的下载进度文件,

每一次下载的进度会保存在这个文件中,下一次下载的时候,会根据进度文件里面的内容来判断下载的进度。

  1. package com.ldw.multilthreaddownload;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.RandomAccessFile;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. public class Multidownload {
  11. static int ThreadCount = 3;   //线程的个数
  12. static int finishedThread = 0;   //初始化下载完成的线程的个数
  13. static String path = "http://192.168.0.102:8080/QQ.exe";  //确定下载地址
  14. public static void main(String[] args) {
  15. // TODO Auto-generated method stub
  16. //发送get请求,请求这个地址的资源
  17. try {
  18. URL url = new URL(path);
  19. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  20. conn.setRequestMethod("GET");
  21. conn.setConnectTimeout(5000);
  22. conn.setReadTimeout(5000);
  23. if(conn.getResponseCode() == 200){
  24. //获取到请求资源文件的长度
  25. int length = conn.getContentLength();
  26. File file = new File("QQ.exe");
  27. //创建随机存储文件
  28. RandomAccessFile raf = new RandomAccessFile(file, "rwd");
  29. //设置临时文件的大小
  30. raf.setLength(length);
  31. //关闭raf
  32. raf.close();
  33. //计算出每一个线程下载多少字节
  34. int size = length / Multidownload.ThreadCount;
  35. for(int i = 0; i < Multidownload.ThreadCount; i ++){
  36. //startIndex,endIndex分别代表线程的开始和结束位置
  37. int startIndex = i * size;
  38. int endIndex = (i + 1) * size - 1;
  39. if(i == ThreadCount - 1){
  40. //如果是最后一个线程,那么结束位置写死
  41. endIndex = length -1;
  42. }
  43. //System.out.println("线程" + i + "的下载区间是" + startIndex + "到" + endIndex);
  44. new DownLoadThread(startIndex, endIndex, i).start();
  45. }
  46. }
  47. } catch (Exception e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. class DownLoadThread extends Thread{
  54. int startIndex;
  55. int endIndex;
  56. int threadId;
  57. public DownLoadThread(int startIndex, int endIndex, int threadId) {
  58. super();
  59. this.startIndex = startIndex;
  60. this.endIndex = endIndex;
  61. this.threadId = threadId;
  62. }
  63. @Override
  64. public void run(){
  65. //使用http请求下载安装包文件
  66. URL url;
  67. try {
  68. File fileProgress = new File(threadId + ".txt");
  69. //判断存储下载进度的临时文件是否存在,
  70. if(fileProgress.exists()){
  71. FileInputStream fis = new FileInputStream(fileProgress);
  72. BufferedReader br = new BufferedReader(new InputStreamReader(fis));
  73. //从下载进度的临时文件中读取上一次下载的总进度,然后和原来文本的开始位置相加,得到新的下载位置
  74. startIndex += Integer.parseInt(br.readLine());
  75. fis.close();
  76. }
  77. System.out.println("线程" + threadId + "下载区间是" + startIndex +"====" + endIndex);
  78. url = new URL(Multidownload.path);
  79. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  80. conn.setRequestMethod("GET");
  81. conn.setConnectTimeout(5000);
  82. conn.setReadTimeout(5000);
  83. //设置请求数据的区间
  84. conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex);
  85. //请求部分数据的响应码是206
  86. if(conn.getResponseCode() == 206){
  87. //获取一部分数据来读取
  88. InputStream is = conn.getInputStream();
  89. byte[] b = new byte[1024];
  90. int len = 0;
  91. int total = 0;
  92. //拿到临时文件的引用
  93. File file = new File("QQ.exe");
  94. RandomAccessFile raf = new RandomAccessFile(file, "rwd");
  95. //更新文件的写入位置,startIndex
  96. raf.seek(startIndex);
  97. while((len = is.read(b)) != -1 ){
  98. //每次读取流里面的数据,同步吧数据写入临时文件
  99. raf.write(b, 0, len);
  100. total += len;
  101. //System.out.println("线程" + threadId + "下载了" + total);
  102. //生成一个专门记录下载进度的临时文件
  103. //File fileProgress = new File(threadId + ".txt");
  104. RandomAccessFile fileProgressraf = new RandomAccessFile(fileProgress, "rwd");
  105. //每一次读取流里面的数据以后,把当前线程下载的总进度写入临时文件中
  106. fileProgressraf.write((total + "").getBytes());
  107. fileProgressraf.close();
  108. }
  109. System.out.println("线程" + threadId + "下载过程结束===========================");
  110. raf.close();
  111. //三条线程下载完成以后,清理临时文件
  112. Multidownload.finishedThread++;
  113. //线程安全
  114. synchronized(Multidownload.path){
  115. if(Multidownload.finishedThread == Multidownload.ThreadCount){
  116. for(int i = 0; i < Multidownload.ThreadCount; i++){
  117. File filefinish = new File(i + ".txt");
  118. filefinish.delete();
  119. }
  120. Multidownload.finishedThread = 0;
  121. }
  122. }
  123. }
  124. } catch (Exception e) {
  125. // TODO Auto-generated catch block
  126. e.printStackTrace();
  127. }
  128. }
  129. }

java实现文件的断点续传的下载的更多相关文章

  1. 用java实现文件的断点续传并发下载

    需求: 支持文件批量下载.现在有很多小图片需要批量下载,不希望在服务器打包下载. 支持大文件断点下载.比如下载10G的文件. PC端全平台支持.Windows,macOS,Linux 全浏览器支持.i ...

  2. java实现文件的断点续传

    java实现文件的断点续传: 依赖: <!--文件上传--> <dependency> <groupId>commons-fileupload</groupI ...

  3. java的文件上传和下载 抄袭别人的.在底部有说明.

    =======后续 这里采用的是输出流的方式,我电脑装的是windows系统,测试没有问题,但是当把项目放到Linux系统上跑时,就会出现保存位置错误的情况, 指定的路径就会被当做文件名的一部分保存了 ...

  4. Java实现文件的上传下载

    文件上传,下载的方法: 上传代码 /** * 文件上传.保存 * * @param mapping * @param form * @param request * @param response * ...

  5. Java 实现文件上传、下载、打包、文件copy、文件夹copy。

    文件and文件夹copy package org.test; import java.io.*; public class FileCopy { /** * 复制单个文件 * * @param old ...

  6. http文件的断点续传和下载

    http://www.tuicool.com/articles/ZbyymqJ Content-Disposition:inline; filename= "c501b_01_h264_sd ...

  7. Java Struts文件上传和下载详解

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  8. JAVA SFTP文件上传、下载及批量下载

    JavaJsch  1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/ 2.jsch简介 JSch(Java Secure Channel)是 ...

  9. java+超大文件上传与下载

    ​这里先说下spring mvc 遇到的坑,就是如果文件上传时,后端这样写public String file1(HttpServletRequest request),根据request拿到的东西是 ...

随机推荐

  1. ftp通用类1

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  2. HDU 4764 Stone (2013长春网络赛,水博弈)

    Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. Calculate CRC32 as in STM32 hardware (EWARM v.5.50 and later)

    http://supp.iar.com/Support/?note=64424&from=note+11927 BackgroundThe STM32 devices from ST Micr ...

  4. Ubuntu 中启用 root 帐号

    参考:http://linuxtoy.org/archives/howto_enable_ubuntu_root_account.html 如果你实在需要在 Ubuntu 中启用 root 帐号的话, ...

  5. DWZ(JUI) 教程 跨域请求 iframeNavTab

    如果想navTab访问其他的网址,可以使用 iframe  navTab 使用时也非常简单 <li><a href="http://www.baidu.com"  ...

  6. WCF技术我们应该如何以正确的方式去学习掌握

    一.WCF技术我该如何学习? 阿笨的回答是:作为初学者的我们,那么请跟着阿笨一起玩WCF吧,阿笨将带领大家如何以正确的姿势去掌握WCF技术.由于WCF技术知识点太多了,就纯基础概念性知识都可以单独出一 ...

  7. kettle 数据提取效率提升

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xpliruizhi123/article/details/54580850 最近发现KETTLE抽数 ...

  8. SpringMVC从Controller跳转到还有一个Controller

    1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带參数跳转.带參数拼接url形式跳转,带參数不拼接參数跳转,页面也能显示. 本来以为挺简单的一件事情. ...

  9. MySql错误处理(二) - Condition & Handle

    20.2.10. 条件和处理程序 20.2.10.1. DECLARE条件 20.2.10.2. DECLARE处理程序 特定条件需要特定处理.这些条件可以联系到错误,以及子程序中的一般流程控制. 2 ...

  10. Swift - 从字典(或者Alamofire)直接创建Model文件的工具

    Swift - 从字典(或者Alamofire)直接创建Model文件的工具 效果 1. 常规生成model的方式 2. 通过debug创建model的方式 特性 1. 可以处理JSON格式的字典数据 ...