由于cpu跟内存交换数据比直接跟外设(即硬盘)交换数据效率会更高,所以要保证高效率,必须在缓冲区(即在内存开辟一块区域)里交换数据。即先将数据读到缓冲区中,然后在缓冲区中读取数据,这样文件复制速度会更快。
开始不能复制大容量文件后来经过修改,可以实现了。一开始直接用bis.available();的大小来设置byte数组的容量,由于java虚拟机的heap只支持64M以下的容量,复制超过64M的大文件时就会报错,即堆栈溢出。所以复制文件得换一种方式,即byte数组设置成指定的大小,然后通过循环逐块的读出和写出。
import java.io.*;
//文件复制操作
public class CopyFile {
public static void main(String[] args) throws Exception {
File f = new File("E:\\move\\新龙门客栈_BD.rmvb"); // 原始文件
if (f.isFile() == true) {
long t = System.currentTimeMillis();
BufferedInputStream bis = new BufferedInputStream( new FileInputStream(f));
System.out.println("文件大小(byte):" + bis.available());
byte[] buf = new byte[1024];
File f2 = new File("E:\\ordrd.txt"); // 复制后的文件
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(f2));
int i;
while ((i = bis.read(buf)) != -1) {
bos.flush();// 强制写出
bos.write(buf, 0, i);
}
System.out.println("复制时间(ms):" + (System.currentTimeMillis() - t));
bis.close();
bos.close();
} else {
System.out.println("这不是个文件!");
}
}
}
详细请查看: http://edu.csdn.net/heima