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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值