你的位置:首页 > Java教程

[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="http://www.cnblogs.com//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下载完毕