zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    oracle 11g如何完全卸载
    【Python】Django Model 怎么使用 UUID 作为主键?
    【云计算】K8S DaemonSet 每个node上都运行一个pod
    【Linux】为啥查某个进程的线程,查出来的所有线程的pid不一样啊
    【JavaScript】SVG vs Canvas vs WebGL
    【Python】使用 sphinx 制作简洁而又美观的文档
    【云计算】监控 告警 怎么做
    【Redis】Redis分布式集群几点说道
    【Hadoop】HIVE 小结概览
    【Hadoop】Hive HSQ 使用 && 自定义HQL函数
  • 原文地址:https://www.cnblogs.com/tfper/p/9833722.html
Copyright © 2011-2022 走看看