------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
package Test;
/*
* 用字节流复制文件,并附加异常处理
*/
import java.io.*;
//定义测试类
public class Test01{
//主方法入口
public static void main(String[] args){
//定义起始时间
long start = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
/*
* try catch finally进行异常处理
*/
//可能发生的异常
try{
//所要复制的目标文件的路径和文件名
fis = new FileInputStream("d:\\A.txt");
//复制文件的目的地
fos = new FileOutputStream("d:\\新建文件夹\\A.txt");
//定义一个int型的变量赋初值
int len = 0;
//循环while
while((len = fis.read()) != -1){
//调用write方法写入目的地
fos.write(len);
//刷新
fos.flush();
}
}
//抛出异常
catch(IOException e){
throw new RuntimeException("复制失败");
}
finally{
/*
* 关闭流:本着先开后关的原则(就是一种编程规则)
*/
try{
//判断这个字节输出流是否为null,不是null就关闭流
if(fos != null){
fos.close();
}
}
catch(IOException e){
throw new RuntimeException("关闭字节输出流失败");
}
finally{
try{
if(fis != null){
fis.close();
}
}
catch(IOException e){
throw new RuntimeException("关闭字节输入流失败");
}
}
}
//定义结束时间
long end = System.currentTimeMillis();
//输出时间差
System.out.println("复制时间为:"+(end-start)+"秒");
}
}
1、如果想观察复制的时间,请在方法体的开头和结尾调用currentTimeMillis()方法用一个long或者double型接收(一般老外用long,节省内存),取差值。Eclipse的默认输出 不同,有的是秒有的是毫秒,看需求来写,要是用秒的话就换算一下就行了
2、同样的道理,要想知道为什么要null赋给字节流对象,需要一个一个输出,到最后会输出null(结束标志),同理字节输入
3、同理,字节输入流while((len = fis.read()) != -1),这个 -1 也是要一个一个输出得出最后的结束标志;其次应该注意的是这个len是什么,有很多人迷惑,首先定义了一个变量 len是一个int型,那么在while循环时只要不读到-1那就一直写入,很容易理解len是一个字符有效个数(可以查看read方法),当这个有效个数len 等于 - 1 的时候停止写入
4、关于关闭流的顺序问题,就跟书写方法名等等一样,养成书写规范就行了
package Test;
/*
* 利用字符输入流复制文件,并通过字符数组来提高复制效率
*/
import java.io.*;
//定义测试类
public class Test01 {
//主方法入口
public static void main(String[] args) {
long s = System.currentTimeMillis();
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("d:\\setup.exe");
fw = new FileWriter("d:\\新建文件夹\\setup.exe");
//定义字符数组,进行缓冲,提高效率
char[] buf = new char[1024];
int len = 0 ;
while((len = fr.read(buf))!=-1){
fw.write(buf, 0, len);
fw.flush();
}
}catch(IOException e){
throw new RuntimeException("复制失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
throw new RuntimeException("写入目的关闭资源失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException e){
throw new RuntimeException("读取数据源关闭资源失败");
}
}
}
long e = System.currentTimeMillis();
System.out.println(e - s);
}
}
注:
1、主要是利用字符输入流来复制文件
2、如果文件较大,那么利用读一个字节写一个字节的方法太浪费时间;可以通过定义一个字符数组,让read这个方法去读一个字符数组,那么效率可以大大提高,但是需要注 意的是如果char[] ch = new char[]这个字符数组中的字节数太大,也会导致复制很慢,基于要在系统中开辟一块相当大的空间也是要耗费时间的,所以不用写太大