文件I/O,没有异常



在不打乱代码的情况下使用例如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;  
   }    
 }  

但这让逻辑变得很奇怪。我的意思是当我关闭流时,例如用另一种方法等。
有什么方法可以获得更清晰的代码

像这样的包装器怎么样:

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();
不幸的是,Java中没有直接的方法可以避免检查异常。很少有解决办法:

使用不同的语言

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

尝试使用资源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);  
   }    
 } 

另请参阅:长时间尝试语句。

应用程序异常是有原因的(没有人喜欢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);
}

}

有两个选项可以选择:

首先,您的示例代码是好的,唯一的事情是"在出现异常的情况下,您将返回一个null对象"。因此,您实际上可以发送boolean并将FileOutputStream对象存储为类变量,而不是返回FileOutputStream对象。

因此,如果其他程序想要访问可以进行此调用的程序,并且调用者将根据是否能够成功创建对象而获得True/False,如果为True,则可以为FileOutputStream对象使用类变量。我附上了一些样本代码:

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

然后呼叫者可以拨打这样的电话:

if(isOpenStream) {
    obj.GetfOutSt;
}

相关内容

  • 没有找到相关文章

最新更新