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. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

  2. maria-developers 开发者邮件

    https://lists.launchpad.net/maria-developers/

  3. 报错:TargetException, 非静态方法需要一个目标

    如果实例为null,调用实例方法会报如上错. 解决办法: 检查实例是否为null,考虑什么情况下实例为null,然后排除实例为null的情况.

  4. 使用jQuery实现图片懒加载原理

    原文:https://www.liaoxuefeng.com/article/00151045553343934ba3bb4ed684623b1bf00488231d88d000 在网页中,常常需要用 ...

  5. 【mysql】sum处理null的结果

    SELECT IFNULL() createSCNum, IFNULL() privateScNum FROM security_code_config WHERE tid = 'test_tenem ...

  6. android studio一直卡在Gradle:Executing tasks

    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=554227 新建了个hello world项目,运行就卡在Gradle:Exec ...

  7. 用UIBezierPath数组对UIView进行镂空处理

    用UIBezierPath数组对UIView进行镂空处理 效果 源码 // // CutOutClearView.h // CutOutMaskView // // Created by YouXia ...

  8. 危机边缘第一季/全集Fringe迅雷下载

    本季Fringe Season 2 第二季(2008)看点:一架从汉堡飞往波士顿航班安全着陆,飞机上的机组成员和乘客却全部死亡.这起离奇案件揭开了一连串奇异.危险事件的序幕. 故事将主要讲述年轻的FB ...

  9. spring源代码分析

    预初始化beanDefaultListableBeanFactory preInstantiateSingletons

  10. Orchard之Module升级

    在上一篇中,我们提到了 Migrations,这一篇稍微衍生一下. 1:Migrations 是什么 Orchard 提供了模块升级的功能,即,如果我们模块发布后,需要进行升级,我们可以通过编码来实现 ...