文件I / O没有异常的混乱

时间:2013-02-19 08:00:54

标签: java file exception file-io

使用的最佳方式是什么? 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;  
   }    
 }  

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

4 个答案:

答案 0 :(得分:2)

遗憾的是,没有直接的方法可以避免Java中的已检查异常。很少有解决办法:

使用其他语言

都将已检查的例外视为未选中。

在Java 7中尝试使用资源习惯用法

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

番石榴

Throwables.propagate(Throwable)

避免返回null并吞咽异常:

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

另请参阅:Long try statements

答案 1 :(得分: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 :(得分:1)

应用例外是有原因的(没有人喜欢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);
}

}

答案 3 :(得分:0)

您可以选择几种方式:

首先,您的示例代码是好的,只有"如果发生异常,您将返回一个空对象"。因此,您可以实际发送FileOutputStream而不是返回boolean对象,并将FileOutputStream对象存储为类变量。

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

FileOutputStream

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

FileOutputStream fOutSt;

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