利用多线程进行文件的复制 有更新!

  hehaitao074

      class FileCopy implements Runnable {
        private File src;// 源文件
        private File tar;// 目标文件
        private int n;// 分几部分
        private int no;// 每部分的编号
    
        public FileCopy(File src, File tar, int n, int no) {
            this.src = src;
            this.tar = tar;
            this.n = n;
            this.no = no;
        }
    
        @Override
        public void run() {
            try {
                RandomAccessFile rafsrc = new RandomAccessFile(src, "r");
                RandomAccessFile raftar = new RandomAccessFile(tar, "rw");
                long len = src.length();
                long size = len % n == 0 ? len / 4 : len / 4 + 1;// 每部分的字节数
                byte[] b = new byte[1024 * 8];// 每次读取的文件大小
                int num = 0;// 每次读取的字节数
                long start = size * no;// 读写的起始位置
                rafsrc.seek(start);
                raftar.seek(start);
                int sum = 0;// 累加每次读取个数
                while ((num = rafsrc.read(b)) != -1 && sum < size) {
                    raftar.write(b, 0, num);
                    sum += num;
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    
    }
    
    public class TestFileCopy {
        // 1.复制文件。c:--》D:
        // 多线程:n个线程
        public static void main(String[] args) {
            File src = new File("C:/pdf.zip");
            File tar = new File("c:/pdf_bak.zip");
            int n = 4;// 分几部分复制
            for (int i = 0; i < n; i++) {// 每一部分的编号
                new Thread(new FileCopy(src, tar, n, i)).start();
            }
        }
    }