输入/输出流是否在销毁时关闭?


问题内容

Java中的InputStreams和OutputStreams是否在销毁时关闭()?我完全理解这可能是错误的形式(尤其是在C和C
++世界中),但是我很好奇。

另外,假设我有以下代码:

private void foo()
{
    final string file = "bar.txt";
    Properties p = new Properties();
    p.load( new FileInputStream(file) );
    //...
}

无名的FileInputStream是否在p.load()之后超出范围,并因此被破坏,就像C
++范围规则一样?我尝试在Google上搜索Java的匿名变量范围,但这并没有达到我的预期。

谢谢。


问题答案:

第一个答案:在Java中没有“破坏”(在C
++的意义上)之类的东西。只有垃圾收集器,当看到准备好收集的对象时,它可能会唤醒也可能不会唤醒并完成其工作。Java中的GC通常是不可信的。

第二个答案:有时是,有时不是,但不值得冒险。来自Elliote Rusty Harold的 Java
IO

并非所有流都需要关闭-
例如,字节数组输出流不需要关闭。但是,与文件和网络连接关联的流在使用完后应始终关闭。例如,如果您打开一个文件进行写入,而在浏览过程中却忽略了该文件,则可能会阻止其他进程读取或写入该文件。

根据Harold的说法,输入或输出流也是如此。有一些例外情况(他注意到System.in),但是总的来说,如果您在完成后不关闭文件流,则会冒着一定的风险。并在finally块中关闭它们,以确保即使抛出异常也将它们关闭。