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. Polly简介 — 3. 执行策略

    执行策略 执行策略的常见方式是调用策略的Execute函数 var policy = Policy.Handle<TimeoutException>().Retry();policy.Ex ...

  2. Visual Studio 2012使用NUnit单元测试实践01,安装NUnit并使用

    在Visual Studio 2012中,默认使用Microsoft自带的MS-Test测试框架.但,Visual Studio同样允许使用第三方测试框架,比如NUnit,xUnit,MbUnit,等 ...

  3. C#编程(五十六)----------可观察的集合ObservableCollection

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47080685 可观察的集合 如果需要集合中的元素核实删除或添加的信息,就可以使用Obse ...

  4. h.264 x.264

    这是两个不同类型的东西. x264是视频编码器,H.264是视频编码格式. x264编出来的东西就是h.264的.举个例子来说,x264就好比画图或者photoshop,h.264就好比jpg,bmp ...

  5. 【LeetCode】- Length of Last Word(最后一个单词的长度)

    [ 问题: ] Given a string s consists of upper/lower-case alphabets and empty space characters ' ', retu ...

  6. 清道夫第一季/全集Ray Donovan迅雷下载

    清道夫 第一季 Ray Donovan Season 1 (2013)本季看点:Ray Donovan.一位专职于为洛杉矶的名人和富豪服务的神秘人士.他可以巧妙的解决这个城市中富豪们的那些最麻烦同时又 ...

  7. 将hta包装为exe发布

    hta在打开的时候,有时候会被杀毒软件拦截而不给执行,更重要的一点是通常都可以右击查看源代码,里面如果涉及到域名或者其它的一些细节就很容易被其它人了解. 网络上有一些hta转exe的,类似的软件基本上 ...

  8. Eclipse断点调试(DBG)Android应用

    1.添加断点 双击左侧边框便可添加断点,右击也能添加断点. 2.进入调试模式 点击虫子,然后选择工程运行,快捷键为单击F11 ,如果是正常运行就是Ctrl+F11 3.单步调试+跳到下一个断点 运行到 ...

  9. PHP读写INI文件

    读INI文件 public function readini($name) { if (file_exists(SEM_PATH.'init/'.$name)){ $data = parse_ini_ ...

  10. [转]使用mysql profiles 来查看sql 语句执行计划

    From : http://blog.csdn.net/radkitty/article/details/4632289 要使用该功能,mysql的版本必须在5.0.37版本以上.否则只能使用expl ...