【问题标题】:File I/O without clutering of exceptions文件 I/O 不包含异常
【发布时间】:2013-02-19 08:00:54
【问题描述】:

最好的使用方法是什么? FileOutputStream 不会弄乱我的代码。

示例如下代码:

我需要做的是:

FileOutputStream fOut = new FileOutputStream(file);    
while(!Thread.currentThread().isInterrupted()){  
   fOut.write(data);  
   //other code  
}   

但是如果我添加异常处理就很乱了。例如,我认为类似以下内容:

private FileOutputStream openStream(String file){  
   try{  
      return new FileOutputStream(file);    
   }  
   catch(FileNotFoundException e){  
      return null;  
   }    
 }  

但它使逻辑变得奇怪。我的意思是当我关闭流时,例如在另一种方法等
有什么办法让代码更清晰

【问题讨论】:

    标签: java file exception file-io


    【解决方案1】:

    这样的包装器怎么样:

    public class StreamWrapper {
    
        private FileOutputStream fileOutputStream;
    
        public FileOutputStream open(String file) {
            try {
                fileOutputStream = new FileOutputStream(file);
            } catch (FileNotFoundException e) {
                // Define action
            }
            return fileOutputStream;
        }
    
        public void close() {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                // Define action
            }
        }
    
    }
    

    并像这样使用它:

    StreamWrapper wrapper = new StreamWrapper();
    FileOutputStream fOut = wrapper.open("file");
    // something
    wrapper.close();
    

    【讨论】:

      【解决方案2】:

      不幸的是,在 Java 中没有直接的方法可以避免检查异常。一些解决方法:

      使用不同的语言

      都将已检查的异常视为未检查。

      try-with-resources Java 7 中的成语

      它对catch 并没有真正的帮助,但大大减少了close() 周围的finally 块的数量。

      Throwables.propagate(Throwable) 在番石榴中

      避免返回null 并吞下异常:

      private FileOutputStream openStream(String file){  
         try{  
            return new FileOutputStream(file);    
         }  
         catch(FileNotFoundException e){  
            return Throwables.propagate(e);  
         }    
       } 
      

      另请参阅:Long try statements

      【讨论】:

        【解决方案3】:

        应用异常是有原因的(没有人喜欢 RT 异常...) 您可以使用工厂来隐藏异常处理,但“catch”子句必须在您的代码中的某个位置。

        一个想法是实现您自己的 FileOutputStream 包装器,它将在实例化期间吞下异常,但由于异常是在构造函数中引发的,因此如果文件确实不存在,您最终将处于不稳定状态。

        public class MyFileOutputStream {
        
        private FileOutputStream fis;
        
        public MyFileOutputStream(File file){
            try{
                fis = new FileOutputStream(file);
            } catch (FileNotFoundException e){
                fis = null;
            }
        }
        
        public boolean isOpened(){
            return fis!=null;
        }
        
        public void write(Byte b) throws IOException {
            fis.write(b);
        }
        

        }

        【讨论】:

          【解决方案4】:

          您可以选择以下几种方式:

          首先,您的示例代码很好,唯一的好处是“如果出现异常,您将返回一个空对象”。因此,您实际上可以发送boolean 并将FileOutputStream 对象存储为类变量,而不是返回FileOutputStream 对象。

          因此,如果其他程序想要访问可以进行此调用的程序,并且调用者将获得 True/False,具体取决于它是否可以成功创建对象,如果为 True,则可以使用 @987654324 的类变量@ 目的。我附上了一些示例代码:

          FileOutputStream fOutSt;
          
          private boolean isOpenStream(String file){  
                 try{  
                    fOutSt = new FileOutputStream(file);
                    return true;
                 }  
                 catch(FileNotFoundException e){  
                     return false;  
                 }    
           } 
          

          然后调用者可以像这样拨打电话:

          if(isOpenStream) {
              obj.GetfOutSt;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-26
            • 2012-11-25
            • 1970-01-01
            • 2015-01-17
            • 1970-01-01
            • 2017-08-22
            • 2013-01-07
            • 2011-12-29
            相关资源
            最近更新 更多