Java 不包含异常的文件I/O

Java 不包含异常的文件I/O,java,file,exception,file-io,groovy,scala,Java,File,Exception,File Io,Groovy,Scala,使用例如FileOutputStream的最佳方式是什么,而不会弄乱我的代码 下面的代码示例: 我需要做的是: FileOutputStream fOut = new FileOutputStream(file); while(!Thread.currentThread().isInterrupted()){ fOut.write(data); //other code } 但是如果我加上异常处理,它会变得一团糟。例如,我认为如下所示: private F

使用例如
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中没有直接的方法可以避免检查异常。很少有解决办法:

使用不同的语言 和都将选中的异常视为未选中

在Java7中尝试使用资源习惯用法 它对捕获没有真正的帮助,但是极大地减少了
周围
close()的
块的数量

番石榴 避免返回
null
和吞咽异常:

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

另请参见:。

您可以执行以下几个选项:

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

因此,如果其他程序希望访问可以进行此调用的对象,并且调用方将根据其是否能够成功创建对象而获得True/False,如果该值为True,则可以将class变量用于
FileOutputStream
对象。我随附了一些示例代码:

FileOutputStream fOutSt;

private boolean isOpenStream(String file){  
       try{  
          fOutSt = new FileOutputStream(file);
          return true;
       }  
       catch(FileNotFoundException e){  
           return false;  
       }    
 } 
然后呼叫者可以像这样打电话:

if(isOpenStream) {
    obj.GetfOutSt;
}

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