利用多线程进行文件的复制

时间:2022-11-27 21:38:04
package org.mobiletrain.demo03;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

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();
		}
	}
}