Fork me on GitHub

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

 

posted @ 2015-10-29 10:52  森林森  阅读(647)  评论(0编辑  收藏  举报