用多线程复制文件

package threadCopyFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.Date;
/*  这题关键是把一个视频文件平均分成5份,分别用5个线程copy, 
	每个线程读取文件的起始位置和写入文件的开始位置(两个位置是相同)都不一样
 
	in.skip(from);          //跳一定的字节后再开始读取
	out.seek(from);         //从一定字节后开始写入

	这两个方法里的参数是同一个。
	每个线程只读取to-from个长度的字节
记住视频、图片类型的文件要用**字节流**,否则copy后的文件可能无法打开
*/

public class ThreadCopyFile extends Thread{
	public static String path = "G:\\Media\\城中大盗cd2.rmvb";
	public static String topath = "G:\\城中大盗cd2.rmvb";
	private long from;   //copy起始位置
	private long to;     //copy结束位置
	
	public ThreadCopyFile(long from,long to){
		this.from = from;
		this.to = to;
	}
	
	public void run(){
		try {
			 InputStream in = new FileInputStream(path);  //copy视频类型文件用字节流
			 RandomAccessFile out = new RandomAccessFile(topath,"rw");
			 in.skip(from);          //跳一定的字节后再开始读取
			 out.seek(from);         //从一定字节后开始写入
			 long sumbyte = 0;       //统计读取了多少个字节数
			 byte[] buff = new byte[1024*1024];
			 int len =0;
			 //读取的字节数必须有数量限制 限制小于 to 和from 的差
			 while ((len = in.read(buff))!=-1 && sumbyte<=(to-from)){
				 out.write(buff,0,len);
				 sumbyte += len;
			 }
			 in.close();
			 out.close();
			 Date date2 = new Date();
			 System.out.println(Thread.currentThread().getName()+" 完成时间为:"+date2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		//获取文件的长度  分成5块
		long filelength = new File(ThreadCopyFile.path).length();
		long size = filelength/5;
		Date date = new Date();
		System.out.println("文件拷贝开始时间为:"+date+"\n 正在拷贝文件······");
		//定义5个线程
		for (int i = 0; i < 5; i++) {
			new ThreadCopyFile(i*size,(i+1)*size).start();
		}
//		ThreadCopyFile02 thread2 = new ThreadCopyFile02(size,2*size);
//		thread2.start();
//		ThreadCopyFile02 thread3 = new ThreadCopyFile02(2*size,3*size);
//		thread3.start();
//		ThreadCopyFile02 thread4 = new ThreadCopyFile02(3*size,filelength);
//		thread4.start();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值