首页 > 学院 > 开发设计 > 正文

AccessRandomFile多线程下载文件

2019-11-14 15:15:24
字体:
来源:转载
供稿:网友

 

写一个工具类

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下载完毕

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表