流是否会因错误而自动关闭?

时间:2012-01-20 13:59:25

标签: java io

大家都明白,如果我们从InputStream读取字节并且我们已经读完所有字节(或者我们不打算读到流的末尾),我们必须调用close()释放与流关联的系统资源。

现在我想知道我是read个字节并且它会抛出java.io.IOException,我仍然需要调用close()来释放与该流关联的系统资源吗?

或者,在错误时,流会自动关闭,因此我们无需拨打close()吗?

1 个答案:

答案 0 :(得分:6)

操作系统本身可能关闭流并释放资源,因为进程(即JVM)已终止,但并未强制执行此操作。

您应始终实施finally块,以便在这种情况下关闭它,例如像这样:

InputStream is = null;

try {
    is = new FileInputStream(new File("lolwtf"));
    //read stuff here
} catch (IOException e) {
    System.out.println("omfg, it didn't work");
} finally {
    is.close();
}

如果它首先投入使用,这并不能保证能够正常工作,但是你可能还想在那时终止,因为你的数据源可能会以某种方式搞砸了。如果你保留InputStream的提供者,你可以找到更多关于它的信息,比如,如果我在我的例子中保留了File对象的参考,我可以检查它是否存在等等File的界面,但这是特定于您的特定数据提供者的。

这种策略在网络会话中变得更有用,例如,使用Hibernate ......