RandomAccessFile多线程下载
public class DownloadServer {
    private int threadCount = ;
    private static String fileUrl = "https://dldir1.qq.com/qqtv/mac/TencentVideo_V2.2.1.42253.dmg";
//    private static String fileUrl = "http://statics.garmentnet.cn/file/file_photo/show/news/5c3c055c5793d567739439.jpg";
    private static ExecutorService executorService = new ThreadPoolExecutor(, , , TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new Download(), new ThreadPoolExecutor.DiscardPolicy());
    private static ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(, new Download());
    private int getFileInfo() {
        int count = ;
        try {
            URL url = new URL(fileUrl);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            count = urlConnection.getContentLength();
            System.out.println(count);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }
    private void download(int fileSize) throws IOException {
        File file = new File("d.dmg");
        if (file.exists()) {
            file.delete();
            file.createNewFile();
        }
        int perSize = fileSize / threadCount;
        int start;
        int end;
        for (int i = ; i < threadCount; i++) {
            start = i * perSize;
            if (i == threadCount - ) {
                end = fileSize - ;
            } else {
                end = (i + ) * perSize - ;
            }
            executorService.execute(new Download(fileUrl, file, start, end));
        }
    }
    public static void main(String[] args) {
        DownloadServer downloadServer = new DownloadServer();
        int size = downloadServer.getFileInfo();
        scheduledExecutorService.scheduleAtFixedRate(new DownloadCount(size), , , TimeUnit.MILLISECONDS);
        try {
            downloadServer.download(size);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class Download implements Runnable, ThreadFactory {
    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);
    public Download(){
    }
    public Download(String fileUrl, File file, int start, int end) {
        this.file = file;
        this.start = start;
        this.end = end;
        this.fileUrl = fileUrl;
    }
    @Override
    public void run() {
        try {
            URL url = new URL(fileUrl);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestProperty("Range", "bytes=" + start + "-" + end);
            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();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public Thread newThread(Runnable r) {
        return new Thread(r, "Run-" + threadNum.incrementAndGet());
    }
}
public class DownloadCount implements Runnable {
    private int fileSize;
    public DownloadCount(int fileSize) {
        this.fileSize = fileSize;
    }
    @Override
    public void run() {
        if(fileSize != Download.downloadFileSize.get()) {
            System.out.println(Download.downloadFileSize);
        }
    }
}
RandomAccessFile多线程下载的更多相关文章
- RandomAccessFile多线程下载、复制文件、超大文件读写
		
最近在准备面试,翻了翻自己以前写的Demo,发现自己写了不少的工具包,今天整理了一下,分享给大家. 本文包含以下Demo: 1.常用方法测试 2.在文件中间插入一段新的数据 3.多线程下载文件 4.多 ...
 - Java--使用多线程下载,断点续传技术原理(RandomAccessFile)
		
一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简 ...
 - 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
		
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
 - android 多线程下载 断点续传
		
来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
 - 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
		
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
 - Java 仿迅雷多线程下载
		
package net.webjoy.jackluo.android_json; /** * 1.http Range "bytes="+ start+end * 2.Random ...
 - android程序---->android多线程下载(一)
		
多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...
 - AccessRandomFile多线程下载文件
		
写一个工具类 package com.pb.thread.demo; import java.io.File; import java.io.FileNotFoundException; import ...
 - 通过HTTP协议实现多线程下载
		
1. 基本原理,每条线程从文件不同的位置开始下载,最后合并出完整的数据. 2. 使用多线程下载的好处 下载速度快.为什么呢?很好理解,以往我是一条线程在服务器上下载.也就是说,对应在服务器上, ...
 
随机推荐
- 一个ping大包不通问题的解决过程
			
1.问题描述 存在问题: 深圳的采集机MQ程序无法与应用服务器进行通讯,表现为:获取小数据时正常,获取大数据时超时 场景图如下 2.数据下载测试 使用SCP工具和FTP工具进行数据下载测试,主要是想排 ...
 - jsp一些使用技巧
			
1.web.xml中配置error页面 一.<error-page> <error-code>500</error-code> <location>50 ...
 - LCA Tarjan方法
			
LCA Tarjan方法 不得不说,高中生好厉害,OI大佬,感觉上个大学好憋屈啊! 说多了都是眼泪 链接拿去:http://www.cnblogs.com/JVxie/p/4854719.html
 - 使用 Weinre 调试移动网站
			
在 PC 端,我们可以使用 Firebug 或者 Chrome 开发人员工具方便的调试网站或者 Web 应用.但是,当我们想在移动端调试站点或者应用的时候,这些工具就派不上用场了.因此,移动开发人员都 ...
 - CentOS 7 keepalived+LVS
			
LVS架构中 , 不管是NAT模式还是DR模式 , 当后端的RS宕机了 , 调度器还是会把请求转发到宕掉的RS上 , 然而keepalived可以解决该问题 , 它不仅仅有高可用的功能 , 还有负载均 ...
 - extends 与implements的区别和用法
			
1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以 ...
 - perl 用网易发邮件报错 554 DT:SPM 163 smtp14
			
查看相关链接,貌似被当成垃圾邮件了,发不出去 554 DT:SPM 163 smtp14,EsCowACHUegmKpdc3giRMQ--.29617S2 1553410599,please see ...
 - docker基本管理
			
一.docker基本命令 1.docker 获取镜像 将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像 docker pull ubuntu:12.04 Pullin ...
 - python爬虫——跟踪登录过程以及意外的发现(4)
			
新浪微博的消息还是很多的,值得弄个账号去爬.不过都有账号了,还需要特意再搞一个吗? 直接上去跟踪.分别使用www和wap端登录: wap端相对简单,form表单都没有用到前面传的数据.但是我看到表单时 ...
 - nginx-相关功能分析  第四章
			
# Nginx服务器的rewrite.全局变量.重定向和防盗链相关功能 一:Nginx 后端服务器组的配置: 1.upstream: 用于定义可由proxy_pass,fastcgi_pass,uws ...