/**
* 程序的作用同样是用缓冲流实现文件的复制功能,只不过有以下几点提高:
* 1.针对较大的文件,我们可以读一个字节写一个字节的方式,而不用读完了在写。
* 这样就可以避免预估bytes【】的数组大小
* 2.加入了显示复制用时的方法。
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class copy_2 {
public static final String filepath1 = "/home/zouxu/gcc.tar.bz2"; //要复制的文件地址
public static final String filepath2 = "/home/zouxu/gcc的复制文件"; //复制的去向地址
public static void main(String[] args) {
long copytime = CopyFileByBufferedStream();
System.out.println("复制完成,花费时间为:" + copytime +"ms");
}
private static long CopyFileByBufferedStream()
{
long starttime = System.currentTimeMillis();//开始执行复制时的时间
File file1 = new File(filepath1);//被复制的文件
File file2 = new File(filepath2);//复制完生成的文件
if(!file1.exists())
{
System.out.println("被复制文件不存在,复制失败");
return 0;
}
InputStream inputstream = null; //注意这里为什么要这么做:因为如果写成InputStream inputstream = new FileInputStream(file1),这句话一旦放入try后如果出错,inputstream
//对象定义失败,则会影响后面的缓冲流,所以需要先申明一个空的。
OutputStream outputstream = null; //原因同上
try {
inputstream = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
outputstream = new FileOutputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedInputStream binputstream = new BufferedInputStream(inputstream);
BufferedOutputStream boutputstream = new BufferedOutputStream(outputstream);
int i =-1;
try {
while(( i = binputstream.read()) != -1)
{
boutputstream.write(i);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
binputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
inputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
boutputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
outputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
long endtime = System.currentTimeMillis(); //复制完成时的时间
return (endtime-starttime);
}
}
我们复制的文件是一个大小为99兆的小电影0.0(哈哈。开玩笑的,是一个编译器)。可以发现,耗时在2s左右。