好吧,我一直在做以下(变量名已被更改):
FileInputStream fis = null; try { fis = new FileInputStream(file); ... process ... } catch (IOException e) { ... handle error ... } finally { if (fis != null) fis.close(); }
最近,我开始使用FindBugs,这表明我没有正确关闭流.我决定看看是否有任何可以用finally {}块做的事情,然后我看,哦是的,close()可以抛出IOException.人们应该在这做什么?Java库会抛出太多已检查的异常.
对于Java 7及更高版本,应使用try-with-resources:
try (InputStream in = new FileInputStream(file)) { // TODO: work } catch (IOException e) { // TODO: handle error }
如果你坚持使用Java 6或更低版本......
这种模式避免了使用null进行乱码:
try { InputStream in = new FileInputStream(file); try { // TODO: work } finally { in.close(); } } catch (IOException e) { // TODO: error handling }
有关如何有效处理close的更多细节,请阅读此博文:Java:如何不弄乱流处理.它有更多的样本代码,更深入,覆盖包装的陷阱密切在捕捉块.
类似下面的内容应该这样做,取决于您是否在尝试关闭流时抛出或吞下IOException.
FileInputStream fis = null; try { fis = new FileInputStream(file); ... process ... } catch (IOException e) { ... blah blah blah ... } finally { try { if (fis != null) fis.close(); } catch (IOException e) { } }
您可以使用添加了JDK7 的try-with-resources功能.它的创建恰恰是为了处理这类事情
static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
该文件说:
try-with-resources语句确保在语句结束时关闭每个资源.