使用的最佳方式是什么? 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;
}
}
然而它使逻辑变得奇怪。我的意思是当我关闭流时,例如在另一种方法等。
获得更清晰代码的方法是什么
答案 0 :(得分:2)
遗憾的是,没有直接的方法可以避免Java中的已检查异常。很少有解决办法:
它对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;
}
}