这题关键是把一个视频文件平均分成四份,分别用四个线程copy,
每个线程读取文件的起始位置和写入文件的开始位置(两个位置是相同)都不一样
两个位置相同是指
in.skip(from); //跳一定的字节后再开始读取
out.seek(from); //从一定字节后开始写入
这两个方法里的参数是同一个。
每个线程只读取to-from个长度的字节
记住视频、图片类型的文件要用字节流,否则copy后的文件可能无法打开
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;
/**
* @author $KangMiao$
* 将一个大于200M的视频文件,用4个线程copy到另外一个目录里去。
* 将文件分成4块
*/
public class ThreadCopyFile02 extends Thread{
public static String path = "f:\\Film\\动作\\功夫熊猫.rmvb";
public static String topath = "f:\\功夫熊猫.rmvb";
private long from; //copy起始位置
private long to; //copy结束位置
public ThreadCopyFile02(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) {
//获取文件的长度 分成4块
long filelength = new File(ThreadCopyFile02.path).length();
long size = filelength/4;
Date date = new Date();
System.out.println("文件拷贝开始时间为:"+date+"\n 正在拷贝文件······");
//定义四个线程
for (int i = 0; i < 4; i++) {
new ThreadCopyFile02(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();
}
}