package DemoThingTset;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
class LoadThread implements Runnable {
String sourceFile;
String targetFile;
int threadNo;
int threadNum;
int bufferSize = 1024;
long fileSize;
public LoadThread(String sourceFile, String targetFile, int threadNo,
int threadNum) {
super();
this.sourceFile = sourceFile;
this.targetFile = targetFile;
this.threadNo = threadNo;
this.threadNum = threadNum;
}
public void run() {
File file = new File(sourceFile);
FileInputStream randin = null;//选用FileInputStream是因为其有skip方法,但其没有length方法
RandomAccessFile randout = null;//选用RandomAccessFile是因为其有seek方法
try {
randin = new FileInputStream(file);
long blockSize = file.length()/threadNum;
long startPoint = blockSize*threadNo;
byte[] buffer = new byte[bufferSize];
randout = new RandomAccessFile(targetFile, "rw");
// 出于各种原因,在Android手机调用 skip 方法最终跳过的字节数可能更少一些,所以以此修正
// long at = startPoint;
// while(at > 0){
// long amt = randin.skip(at);
// if(amt == -1){
// throw new RuntimeException();
// }
// at -= amt;
// }
//
// randin.skip(at);
// randout.seek(at);
randin.skip(startPoint);
randout.seek(startPoint);
int temp;
while ((temp=randin.read(buffer))>=0) {
randout.write(buffer, 0, temp);
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
randin.close();
randout.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
public class DemoTest {
public static void main(String args[]) throws IOException {
String sourceFile="D:/Downloads/aliedit.exe";
String targetFile="D:/Downloads/aliedit3.exe";
int threadNo;
int threadNum=3;
for(threadNo=0;threadNo<=threadNum;threadNo++){
new Thread(new LoadThread(sourceFile,targetFile,threadNo,threadNum)).start();
}
}
}
多线程复制文件
最新推荐文章于 2023-08-31 13:49:31 发布