zoukankan      html  css  js  c++  java
  • 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下载完毕
  • 相关阅读:
    decode函数
    自我介绍
    语法》第六章 数组
    语法》第二章 数据类型
    语法》第四章 字符串
    语法》第七章 函数
    取模和取余的区别
    语法》第五章 对象
    语法》第三章 数值
    语法》第一章 基本语法
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4902431.html
Copyright © 2011-2022 走看看