黑马程序员——IO流部分程序解析

来源:互联网 发布:linux ftp断点续传 编辑:程序博客网 时间:2024/06/05 05:00

------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;//循环whilewhile((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[]这个字符数组中的字节数太大,也会导致复制很慢,基于要在系统中开辟一块相当大的空间也是要耗费时间的,所以不用写太大

0 0
原创粉丝点击