3

什么是最好的使用方法,例如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

4 回答 4

2

不幸的是,在 Java 中没有直接的方法可以避免检查异常。几个变通办法:

使用不同的语言

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

Java 7 中的 try-with-resources习惯用法

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

Throwables.propagate(Throwable)在番石榴

避免返回null和吞咽异常:

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

另请参阅:长尝试语句

于 2013-02-19T08:13:48.367 回答
2

像这样的包装器怎么样:

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();
于 2013-02-19T08:13:18.980 回答
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);
}

}

于 2013-02-19T08:20:50.010 回答
0

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

首先,您的示例代码很好,唯一的好处是“如果出现异常,您将返回一个空对象”。FileOutputStream因此,您实际上可以发送一个对象并将其boolean存储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;
}
于 2013-02-19T08:17:49.753 回答