在处理流时,我经常在 Java 文档和其他人的代码中看到以下模式:
FileInputStream fis = null;
try {
fis = new FileInputStream("some.file");
// do something useful with fis
} finally {
if (fis != null) {
fis.close();
}
}
但是我个人更喜欢不同的模式:
FileInputStream fis = new FileInputStream("some.file");
try {
// do something useful with fis
} finally {
fis.close();
}
我喜欢后者的简洁,我认为这是正确的。但我对正确性的看法是对的吗?是否有客观的理由偏爱一个而不是另一个?
更新
即使我编写的示例几乎是如何在现实生活中编写这样的代码,我的模式仍然更加简洁。比较文档方法:
public Object processFile(String fn) throws MyException {
FileInputStream fis = null;
try {
fis = new FileInputStream(fn);
return new Object(); // somehow derived from fis
} catch (FileNotFoundException e) {
throw new MySubExceptionForNotFound(e);
} catch (IOException e) {
throw new MySubExceptionForIoError(e);
} finally {
if (fis != null) {
IOUtils.closeQuietly(fis);
}
}
}
用我的方法:
public Object processFile(String fn) throws MyException {
try {
FileInputStream fis = new FileInputStream(fn);
try {
return new Object(); // somehow derived from fis
} finally {
IOUtils.closeQuietly(fis);
}
} catch (FileNotFoundException e) {
throw new MySubExceptionForNotFound(e);
} catch (IOException e) {
throw new MySubExceptionForIoError(e);
}
}
我的短了一行!:D
fis.close()
有趣的是,如果您决定使用而不是IOUtils.closeQuietly()
“官方”代码将再增长 4 行,我的代码不会改变。