大家都明白,如果我们从InputStream读取字节并且我们已经读完所有字节(或者我们不打算读到流的末尾),我们必须调用close()释放与流关联的系统资源。
现在我想知道我是read个字节并且它会抛出java.io.IOException,我仍然需要调用close()来释放与该流关联的系统资源吗?
或者,在错误时,流会自动关闭,因此我们无需拨打close()吗?
答案 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 ......