1 package multiThread; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.RandomAccessFile; 6 7 import org.junit.Test; 8 9 public class MultiThreadCopy { 10 public void copy(String srcFile, String destFile) { 11 File sf = new File(srcFile); 12 // 源文件大小 13 int length = (int) sf.length(); 14 // 线程数 15 int count = 3; 16 // 每个线程复制的大小 17 int blockSize = length / count; 18 for (int i = 0; i < count; i++) { 19 int startPos = i * blockSize; 20 int endPos = 0; 21 if (i != (count - 1)) { 22 endPos = (i + 1) * blockSize - 1; 23 } else { 24 endPos = length - 1; 25 } 26 // 开线程 27 new ThreadCopy(srcFile, destFile, startPos, endPos).start(); 28 } 29 } 30 31 /** 32 * 复制线程 33 */ 34 class ThreadCopy extends Thread { 35 private String srcFile; 36 private String destFile; 37 private int startPos; 38 private int endPos; 39 40 public ThreadCopy(String srcFile, String destFile, int startPos, int endPos) { 41 super(); 42 this.srcFile = srcFile; 43 this.destFile = destFile; 44 this.startPos = startPos; 45 this.endPos = endPos; 46 } 47 48 public void run() { 49 try { 50 // 源文件 51 RandomAccessFile srcRaf = new RandomAccessFile(srcFile, "r"); 52 // 目标文件 53 RandomAccessFile destRaf = new RandomAccessFile(destFile, "rw"); 54 // 定位读存位置 55 srcRaf.seek(startPos); 56 destRaf.seek(startPos); 57 // 读取的字节数 58 int bytes = endPos - startPos + 1; 59 byte[] buf = new byte[1024]; 60 int len = 0; 61 // 读取次数 62 int count = bytes / buf.length; 63 for (int i = 0; i < count; i++) { 64 // 最后一次读取 65 if (i == (count - 1)) { 66 if ((bytes % buf.length) != 0) { 67 buf = new byte[buf.length + (bytes % buf.length)]; 68 srcRaf.read(buf); 69 destRaf.write(buf); 70 } else { 71 srcRaf.read(buf); 72 destRaf.write(buf); 73 } 74 srcRaf.close(); 75 destRaf.close(); 76 77 } else { 78 srcRaf.read(buf); 79 destRaf.write(buf); 80 } 81 } 82 83 } catch (Exception e) { 84 e.printStackTrace(); 85 } 86 } 87 } 88 @Test 89 public static void main(String[] args){ 90 MultiThreadCopy mt = new MultiThreadCopy(); 91 String src="E:\\大数据资料\\文件\\java基础\\视频\\day09\\day01_01集合的复习.avi"; 92 String des="E:\\day01_01集合的复习.avi"; 93 mt.copy(src, des); 94 } 95 }
时间: 2024-10-29 04:38:51