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