1. public class DownloadServer {
  2.  
  3. private int threadCount = ;
  4. private static String fileUrl = "https://dldir1.qq.com/qqtv/mac/TencentVideo_V2.2.1.42253.dmg";
  5. // private static String fileUrl = "http://statics.garmentnet.cn/file/file_photo/show/news/5c3c055c5793d567739439.jpg";
  6.  
  7. private static ExecutorService executorService = new ThreadPoolExecutor(, , , TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new Download(), new ThreadPoolExecutor.DiscardPolicy());
  8.  
  9. private static ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(, new Download());
  10.  
  11. private int getFileInfo() {
  12. int count = ;
  13. try {
  14. URL url = new URL(fileUrl);
  15. HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
  16. count = urlConnection.getContentLength();
  17. System.out.println(count);
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }
  21. return count;
  22. }
  23.  
  24. private void download(int fileSize) throws IOException {
  25. File file = new File("d.dmg");
  26. if (file.exists()) {
  27. file.delete();
  28. file.createNewFile();
  29. }
  30. int perSize = fileSize / threadCount;
  31. int start;
  32. int end;
  33. for (int i = ; i < threadCount; i++) {
  34. start = i * perSize;
  35. if (i == threadCount - ) {
  36. end = fileSize - ;
  37. } else {
  38. end = (i + ) * perSize - ;
  39. }
  40.  
  41. executorService.execute(new Download(fileUrl, file, start, end));
  42. }
  43. }
  44.  
  45. public static void main(String[] args) {
  46. DownloadServer downloadServer = new DownloadServer();
  47. int size = downloadServer.getFileInfo();
  48. scheduledExecutorService.scheduleAtFixedRate(new DownloadCount(size), , , TimeUnit.MILLISECONDS);
  49. try {
  50. downloadServer.download(size);
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  1. public class Download implements Runnable, ThreadFactory {
  2.  
  3. private String fileUrl;
    private File file;
    private int start;
    private int end;
    public static AtomicInteger downloadFileSize = new AtomicInteger(0);
    private static AtomicInteger threadNum = new AtomicInteger(0);
  4.  
  5. public Download(){
  6.  
  7. }
  8.  
  9. public Download(String fileUrl, File file, int start, int end) {
    this.file = file;
    this.start = start;
    this.end = end;
    this.fileUrl = fileUrl;
    }
  10.  
  11. @Override
    public void run() {
    try {
    URL url = new URL(fileUrl);
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    httpURLConnection.setRequestProperty("Range", "bytes=" + start + "-" + end);
  12.  
  13. InputStream inputStream = httpURLConnection.getInputStream();
    RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
    randomAccessFile.seek(start);
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = inputStream.read(bytes)) != -1) {
    randomAccessFile.write(bytes, 0, len);
    downloadFileSize.addAndGet(len);
    // System.out.println(Thread.currentThread().getName() + "-" + downloadFileSize.addAndGet(len));
    }
    randomAccessFile.close();
  14.  
  15. } catch (IOException e) {
    e.printStackTrace();
    }
    }
  16.  
  17. @Override
    public Thread newThread(Runnable r) {
    return new Thread(r, "Run-" + threadNum.incrementAndGet());
    }
    }
  1. public class DownloadCount implements Runnable {
  2.  
  3. private int fileSize;
    public DownloadCount(int fileSize) {
    this.fileSize = fileSize;
    }
  4.  
  5. @Override
    public void run() {
    if(fileSize != Download.downloadFileSize.get()) {
    System.out.println(Download.downloadFileSize);
    }
    }
    }
  1.  
  1.  

RandomAccessFile多线程下载的更多相关文章

  1. RandomAccessFile多线程下载、复制文件、超大文件读写

    最近在准备面试,翻了翻自己以前写的Demo,发现自己写了不少的工具包,今天整理了一下,分享给大家. 本文包含以下Demo: 1.常用方法测试 2.在文件中间插入一段新的数据 3.多线程下载文件 4.多 ...

  2. Java--使用多线程下载,断点续传技术原理(RandomAccessFile)

    一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简 ...

  3. 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】

    一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...

  4. android 多线程下载 断点续传

    来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...

  5. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  6. Java 仿迅雷多线程下载

    package net.webjoy.jackluo.android_json; /** * 1.http Range "bytes="+ start+end * 2.Random ...

  7. android程序---->android多线程下载(一)

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...

  8. AccessRandomFile多线程下载文件

    写一个工具类 package com.pb.thread.demo; import java.io.File; import java.io.FileNotFoundException; import ...

  9. 通过HTTP协议实现多线程下载

    1. 基本原理,每条线程从文件不同的位置开始下载,最后合并出完整的数据. 2. 使用多线程下载的好处     下载速度快.为什么呢?很好理解,以往我是一条线程在服务器上下载.也就是说,对应在服务器上, ...

随机推荐

  1. javaweb(3)之JSP&EL&JSTL

    JSP(Java Server Page) 介绍 什么是 JSP ? 从用户角度看,JSP 就是一个网页. 从开发者角度看,它其实就是一个继承了 Servlet 的 java 类,所以可以直接说 JS ...

  2. java框架之Hibernate(1)-简介及初使用

    简介 hibernate 是一个开源 ORM ( Object / Relationship Mipping ) 框架,它是对象关联关系映射的持久层框架,它对 JDBC 做了轻量级的封装,而我们 ja ...

  3. 自动微分(AD)学习笔记

    1.自动微分(AD) 作者:李济深链接:https://www.zhihu.com/question/48356514/answer/125175491来源:知乎著作权归作者所有.商业转载请联系作者获 ...

  4. abap test msg

  5. 【JVM】-NO.110.JVM.1 -【JDK11 HashMap详解】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  6. JAVA微信支付代码(WeChatPay.java 才是调用类)

    微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html MD5Util.java package weixin; import java.se ...

  7. #WEB安全基础 : HTTP协议 | 0x6 初识HTTP报文

    欢迎来到HTTP最精彩的部分 请注意:应用HTTP协议时,必定有一方担任客户端,另一方担任服务器 客户端向服务器发出请求,服务器向客户端返回响应 下面是一个请求与相应的例子: 请求: GET /ind ...

  8. 第三章 document对象及数组

    1.数组的使用(1)声明数组var 数组名=new Array();(2)数组赋值数组名[下标]=值: 2.数组声明,分配空间,赋值同时进行var 数组名=new Array(值1,值2....)va ...

  9. 使用freemarker和itext把html转pdf

    1.把html转pdf,首先必须要解决中文显示问题,CSS样式问题以及可能的JS问题,先上例子,自己去体会. 2.先去下载simsun.ttc字体: 2.demo.html <!DOCTYPE ...

  10. perl 用网易发邮件报错 554 DT:SPM 163 smtp14

    查看相关链接,貌似被当成垃圾邮件了,发不出去 554 DT:SPM 163 smtp14,EsCowACHUegmKpdc3giRMQ--.29617S2 1553410599,please see ...