java-文件流正确关闭资源

用文件流来拷贝一个文件,用到文件字节输入流(FileInputStream)和文件字节输出流(FileOutputStream),用输入流把字节文件读到缓冲数组中,然后将缓冲数组中的字节写到文件中,就很好的完成了文件的复制操作。

来,看一下代码

 1         //1.创建源和目标
 2         File srcFile = new File("C:/Users/15626/Desktop/test/123.txt");
 3         File targetFile = new File("C:/Users/15626/Desktop/test/123_copy.txt");
 4         //2.创建输入流和输出流
 5         FileInputStream in = new FileInputStream(srcFile);
 6         FileOutputStream out = new FileOutputStream(targetFile);
 7         //3.输入 输出操作
 8         byte[] buffer = new byte[10];    
 9         int len = 0;
10         while((len = in.read(buffer)) != -1){
11             //String str = new String(buffer,0,len);
12             out.write(buffer, 0, len);;
13         }        
14         //4.关闭资源文件
15         in.close();
16         out.close();

完了你会发现出现了

全是错误,那是因为输出输出可能会出现异常,可能你会直接抛出去,那么怎么正确处理这些异常情况?

当然是try-catch-finally

 1         FileInputStream in = null;
 2         FileOutputStream out = null;
 3         try{//可能出现问题的代码
 4             //1.创建源和目标
 5             File srcFile = new File("C:/Users/15626/Desktop/test/123.txt");
 6             File targetFile = new File("C:/Users/15626/Desktop/test/123_copy.txt");
 7             //2.创建输入流和输出流
 8             in = new FileInputStream(srcFile);
 9             out = new FileOutputStream(targetFile);
10             //3.输入 输出操作
11             byte[] buffer = new byte[10];    
12             int len = 0;
13             while((len = in.read(buffer)) != -1){
14                 //String str = new String(buffer,0,len);
15                 out.write(buffer, 0, len);;
16             }        
17         }catch(Exception e){//处理异常
18             e.printStackTrace();
19         }finally{
20             //4.关闭资源文件
21             try{
22                 in.close();
23                 out.close();                
24             }catch(Exception e){
25                 e.printStackTrace();
26             }
27         }

好了,到这里之后异常终于消除了,然而这个程序还是有问题:

  当程序执行到  in = new FileInputStream(srcFile); 的时候,假设有个异常,然后程序后去处理这个异常,根本没有执行下面的程序,然而这时候out还是null,在finally中还关闭了out,本身没有异常,你制造了异常。  那么怎么解决呢?

  那么将它们分开try就ok了:

 

 1         finally{
 2             //4.关闭资源文件
 3             try{
 4                 if(in != null){
 5                     in.close();
 6                 }
 7             }catch(Exception e){
 8                 e.printStackTrace();
 9             }
10             try{
11                 if(out != null){
12                     out.close();                
13                 }
14 
15             }catch(Exception e){
16                 e.printStackTrace();
17             }            
18         }

到这你会发现程序的主体都在上面,然而下面却处理了这么多异常还有关闭资源,程序变得很难看!然而java7之后,出现了自动关闭资源的机制,我去,这感情好啊,来欣赏一下:

 1         File srcFile = new File("C:/Users/15626/Desktop/test/123.txt");
 2         File targetFile = new File("C:/Users/15626/Desktop/test/123_copy.txt");
 3         try(//打开资源的代码
 4             FileInputStream in = new FileInputStream(srcFile);
 5             FileOutputStream out = new FileOutputStream(targetFile);
 6             ){
 7             //3.输入 输出操作
 8             byte[] buffer = new byte[10];    
 9             int len = 0;
10             while((len = in.read(buffer)) != -1){
11                 //String str = new String(buffer,0,len);
12                 out.write(buffer, 0, len);;
13             }        
14         }catch(Exception e){
15             e.printStackTrace();
16         }

嗯,这个新特性很好!

1 try(打开资源的代码 ){
2 
3   可能存在异常的代码
4 
5 }catch(){
6 
7   处理异常信息
8 
9 }
原文地址:https://www.cnblogs.com/tfper/p/9833722.html