AccessRandomFile多线程下载文件

写一个工具类

package com.pb.thread.demo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 多线程复制文件工具类
 *
 * @author denny
 *
 */
public class MutiCopyFileUtil {
    private String src;// 源文件
    private String dst;// 目标文件
    private int threadSize;// 开启多少个线程去复制源文件
    /**
     * 包含3个参数的构造方法
     *
     * @param src
     *            源文件
     * @param dst
     *            目标文件
     * @param threadSize
     *            开启多少个线程去复制源文件
     */
    public MutiCopyFileUtil(String src, String dst, int threadSize) {
        super();
        this.src = src;
        this.dst = dst;
        this.threadSize = threadSize;
    }

    /**
     * 复制文件的方法
     */
    public void copyFile() {
        File file = new File(src);// 源文件的File对象
        // 获取源文件大小字节数
        long fsize = file.length();
        // 计算每个线程下载的字节数
        long block = fsize % threadSize == 0 ? fsize / threadSize : fsize / threadSize + 1;
        // 开启循环调用
        for (int threadId = 0; threadId < threadSize; threadId++) {
            // 开启多个个线程来进行文件的复制,
            new DownloadThread(fsize, block, threadId).start();
        }
    }

    /**
     *
     * @author denny
     *
     */
    private class DownloadThread extends Thread {
        private long fsize;// 文件大小
        private long block;// 每个线程下载的字节数
        private int threadId;// 线程的ID号,从0开始
        private int buffSize=1024*1024; //缓冲区大小

        public DownloadThread(long fsize, long block, int threadId) {
            super();
            this.fsize = fsize;
            this.block = block;
            this.threadId = threadId;

        }

        /**
         * 重写run方法
         */
        public void run() {
            try {

                // 随机访问文件对象 声明IO类,以只读的模式访问文件
                RandomAccessFile reader = new RandomAccessFile(src, "r");
                // 随机访问文件对象
                RandomAccessFile writer = new RandomAccessFile(dst, "rw");
                // 每个线程下载的启始位置
                long startPos = threadId * block;
                // 确定每个线程下载的结束位置
                long endPos = startPos + block > fsize ? fsize : startPos + block;
                /*
                 * 判断下载的结束位置是不是比文件最大的位置还大,
                 * 是的话就是文件的最大位置,
                 * 不是的话就是开始位置+要下载的字节大小
                 */

                //设置游标的位置
                reader.seek(startPos);
                //设置目标文件的
                writer.seek(startPos);
                //设置缓冲区
                byte[] buf=new byte[buffSize];
                while(startPos<endPos){
                    int len=0;
                    //判断是不是到结束位置
                    if(startPos+buffSize<endPos){
                        //读取文件到缓冲区,读满
                        len=reader.read(buf);

                    }else{
                            //把剩下的填不满缓冲区的数据写到缓冲区中
                        len=reader.read(buf, 0, (int)(endPos-startPos));
                    }
                    //改变起始位置
                    startPos+=len;
                    /*写入目标文件
                     * 把缓冲区的文件写入目标文件
                    */
                    writer.write(buf,0,len);
                    System.out.println("线程"+(threadId+1)+"下载了:"+len);
                }
                reader.close();
                writer.close();
                System.out.println("线程"+(threadId+1)+"下载完毕");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

测试类

package com.pb.thread.demo;

import java.io.File;

/**
 *
 * @author denny
 *
 */
public class MutiCopyFileDemo {

    public static void main(String[] args) {
        /*
         * /home/denny/Downloads
         * android-studio-ide-141.2135290-linux.zip
         */
        String src="/home/denny/Downloads/android-studio-ide-141.2135290-linux.zip";
        String dst="/home/denny/Downloads/a.zip";
        MutiCopyFileUtil mcf=new MutiCopyFileUtil(src,dst,10);
        mcf.copyFile();
    }

}

结果:

线程9下载了:1048576
线程6下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程6下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程10下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程5下载了:1048576
线程1下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程9下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程3下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程9下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程1下载了:1048576
线程7下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程3下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程1下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程9下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程9下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程1下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程3下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程2下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程5下载了:1048576
线程10下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程3下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程2下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程7下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程3下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程6下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程1下载了:1048576
线程6下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程3下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程7下载了:1048576
线程7下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程7下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:596259
线程5下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程1下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程6下载完毕
线程9下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程10下载了:1048576
线程7下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程2下载了:1048576
线程7下载了:596259
线程7下载完毕
线程10下载了:1048576
线程4下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程10下载了:596259
线程10下载完毕
线程2下载了:1048576
线程4下载了:1048576
线程9下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程2下载了:596259
线程2下载完毕
线程3下载了:1048576
线程1下载了:1048576
线程3下载了:1048576
线程4下载了:1048576
线程1下载了:1048576
线程9下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程4下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程5下载了:596259
线程9下载了:1048576
线程1下载了:1048576
线程5下载完毕
线程4下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程4下载了:1048576
线程9下载了:596259
线程9下载完毕
线程1下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程1下载了:1048576
线程4下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程4下载了:1048576
线程3下载了:596259
线程3下载完毕
线程4下载了:596259
线程1下载了:1048576
线程4下载完毕
线程8下载了:1048576
线程8下载了:596259
线程8下载完毕
线程1下载了:1048576
线程1下载了:1048576
线程1下载了:596259
线程1下载完毕
时间: 2025-01-04 06:44:49

AccessRandomFile多线程下载文件的相关文章

多线程下载文件,以及断点下载

一:前言 多线程下载文件,可能有的同学没有过多的听说过,但是断点下载肯定是听过的,也就是说像讯雷,哪怕你把电脑重启了,讯雷重新启动后也会接着原来的地方下载,那么这是怎么做到的呢? 二:代码示例 直接给出代码, 2.1.经典代码 两行经典的代码分别为: //设置下载的开始及结束位置 conn.setRequestProperty("Range", "bytes="+start+"-"+end+""); //设置读写的起点位置 R

最新---java多线程下载文件

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Demo { // 定义线程个数 public static int threadCount = 5; public static void main(String[] args) throws Exception { // 1,连接到服务

多线程下载文件(支持暂停、取消、断点续传)

多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne

多线程实现多线程下载文件

下载文件的时候,一个大文件切成很多片,用多线程下载,速度会快很多 阅读代码的时候注意查看代码里面的注释想用多线程下载文件,则, 第一:得了解  RandomAccessFile  类,这是个随机访问文件类,里面可以设置 访问的 开始地址和结束地址,且该类可读可写. RandomAccessFile out = new RandomAccessFile(file, "rw"); 则表示,该类可读可写.通过 out.seek(start)  可以定位开始读取的位置. 第二:既然是网络文件下

python多线程下载文件

从文件中读取图片url和名称,将url中的文件下载下来.文件中每一行包含一个url和文件名,用制表符隔开. 1.使用requests请求url并下载文件 def download(img_url, img_name): with closing(requests.get(img_url, stream=True)) as r: with open(os.path.join(out_dir, img_name), 'wb') as f: for data in r.iter_content(102

安卓 多线程下载文件

HTTP文件多线程下载 测试代码 String downloadUrl = "http://192.168.31.162/FileServer/SoftApk/UC-11.5.5.943.apk"; String filepath = PathUtils.getCachePath() + "UC-11.5.5.943.apk"; /** * 多线程下载 * 基于:http://blog.csdn.net/mad1989/article/details/3842146

Java多线程下载文件

package com.test.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /*  * 多线程下载  */ public class MulThreadDownload {     public static void main(String[]

ios开发网络学习五:MiMEType ,多线程下载文件思路,文件的压缩和解压缩

一:MiMEType:一般可以再百度上搜索到相应文件的MiMEType,或是利用c语言的api去获取文件的MiMEType : //对该文件发送一个异步请求,拿到文件的MIMEType - (void)MIMEType { //    NSString *file = @"file:///Users/文顶顶/Desktop/test.png"; [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[

Android多线程下载文件

Android 实现多线程下载: 首先看下效果图: UI界面 多线程下载的时候log打印界面 开始工作,首先我们通过HttpURLConnection类连接需要下载的文件: new Thread(new Runnable() { @Override public void run() { try { url = new URL(DOWNURL); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); // conn