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

Pac*_*ier 5 java io

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

现在我想知道我是否读取字节并抛出java.io.IOException,我是否仍然需要调用close()来释放与流相关的系统资源?

或者是错误的,流是自动关闭的,所以我们不必调用close()

TC1*_*TC1 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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