import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
public class AdvancedCopy {
public void advancedCopy(File sourse,File target) throws IOException{
long fileSize = sourse.length();
int bufferLength = 1024*1024*2;//每次传输2m
int times = (int) (fileSize/bufferLength);//用于计算最后一次还剩多少,并限定for的次数
int remain = (int) (fileSize - times*bufferLength);
FileInputStream fileInputStream = new FileInputStream(sourse);
FileChannel fileChannel = fileInputStream.getChannel();//从输入流获得通道
ByteBuffer byteBuffer = null;//字节缓冲区
FileOutputStream fileOutputStream = new FileOutputStream(target);
FileChannel fileChannel2 = fileOutputStream.getChannel();//从输出流获得通道
int i = 0;//记录第几次传输
for (; i < times; i++) {//i是第几次传输
byteBuffer = fileChannel.map(MapMode.READ_ONLY, i*bufferLength, bufferLength);//读取指定长度的字节到内存中的bytebuffer中,第二个参数是起始字节,第三个参数是读写数量
fileChannel2.write(byteBuffer);
System.out.println("正在进行"+i+"/"+times);
}
byteBuffer = fileChannel.map(MapMode.READ_ONLY, i*bufferLength, remain);//最后一次读写
System.out.println("传输完成");
}
}
调用方法
File sourse = new File("E:/Edius6dot02-cr.zip");
File target = new File("i:/Edius6dot02-cr.zip");
new AdvancedCopy().advancedCopy(sourse, target);