CopyFile类:
/**
* 这个复制文件的方法,可能会出现问题
* 文件越小越容易出问题
* 10字节的文件复制完只剩6字节(byte数组长度定义为1的时候)
*
* 文件大的时候,均分成6组,如果不能整除,
* 而且数组长度大一点的时候,
* 读取的时候,可能会刚好跳过totalLength,把整个文件读完
* @author Michael
*
*/
public class CopyFile extends Thread{
private File sourceFile;
private File targetFile;
private int blockCount; //线程数,即将文件分割成几块
private int blockNum; //第几块
public CopyFile(File sourceFile, File targetFile, int blockCount, int blockNum) {
super();
this.sourceFile = sourceFile;
this.targetFile = targetFile;
this.blockCount = blockCount;
this.blockNum = blockNum;
}
public void write() {
try {
long size=sourceFile.length(); //文件总长度
long blockLength=size/blockCount; //每块的长度
long startPosition=blockLength*blockNum; //每块的开始位置
byte[] buffer=new byte[1];
RandomAccessFile rai = new RandomAccessFile(sourceFile, "r");
RandomAccessFile rao = new RandomAccessFile(targetFile, "rw");
rai.seek(startPosition);
rao.seek(startPosition);
int curReadLength;
int totalReadLength=0;
while((curReadLength = rai.read(buffer))>0 && totalReadLength<blockLength) {
rao.write(buffer,0,curReadLength);
totalReadLength+=curReadLength;
}
rao.close();
rai.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
write();
}
}
Test类:
CSDN博客的编辑器太傻逼了 拜拜了CSDN
public class Test {
public static void main(String[] args) {
File sourceFile = new File("d:/a.png");
File targetFile = new File("e:/b.png");
for (int i = 0; i < 6; i++) {
CopyFile cp = new CopyFile(sourceFile, targetFile, 6, i);
cp.start();
}
}
}