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. 搭建基于crtmpserver的点播解决方案

    1. linux环境下build并启动crtmpserver 这部分可以参见我写的专项详解文章 <crtmpserver流媒体服务器的介绍与搭建> 和 <crtmpserver配置文 ...

  2. CGI-- FASTCGI

    http://blog.csdn.net/sweatott/article/details/54913151 CGI:是 Web Server 与 Web Application 之间数据交换的一种协 ...

  3. Revit API通过相交过滤器找到与风管相交的对象。

    相交过滤器的应用,比几何相交法简便.Excluding剔除 //找到与风管相交的对象,通过相交过滤器. [TransactionAttribute(Autodesk.Revit.Attributes. ...

  4. C#远程调用技术WebService葵花宝典

    一.课程介绍 直接开门见山吧,在学习之前阿笨想问大家一句,关于WebService远程过程调用技术(RPC) 你真的会了吗?不要跟老夫扯什么WebService技术已经过时,如果你的内心有在偷偷告诉你 ...

  5. 沉浸式Web初体验

    沉浸就是让人专注在当前的情境下感到愉悦和满足,而忘记真实世界的情境.心流理论能有力解释人们废寝忘食地投入一件事情的状态. 心流理论的核心就是说当人的技能与挑战最佳匹配时能达到心流状态.比如玩一个游戏, ...

  6. Delphi XE 6,Rad Studio XE 6 官方下载(附破解)

      官方光盘镜像下载: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win.iso RAD Studio ...

  7. 查看Oracle数据库名和实例名的命令

      查看数据库名 SQL> select name from v$database; NAME --------- ORCL SQL> desc v$database; 名称       ...

  8. windows下PHP不能开启pgsql扩展的解决方法

    Tip: 环境 windows8.1 64位 + xampp1.8.1 + postgresql 9.3.6-2 第一步: php.ini中开启pgsql扩展  extension=php_pgsql ...

  9. StringBuffer与StringBuilder差别

    从JDK源代码能够看出,StringBuffer和StringBuilder都是继承自AbstractStringBuilder,事实上这两个类的功能实现都是在AbstractStringBuilde ...

  10. ViewPager的简单用法+适配器+监听器的介绍

    之前的actionbar+fragment文章中写过viewpager的简单用法,但因为是融合的文章,所以今天把viewpager提取出来写了.方便查询浏览~ 思路: 1.在布局文件中设置viewpa ...