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

标签 java scope

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's Java IO :

Not all streams need to be closed—byte array output streams do not need to be closed, for example. However, streams associated with files and network connections should always be closed when you're done with them. For example, if you open a file for writing and neglect to close it when you're through, then other processes may be blocked from reading or writing to that file.

根据 Harold 的说法,输入或输出流也是如此。有一些异常(exception)(他注意到 System.in),但一般来说,如果您在完成后不关闭文件流,那么您就是在冒险。并在 finally block 中关闭它们,以确保即使抛出异常它们也会关闭。

关于java - 输入/输出流是否在销毁时关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522370/

相关文章:

java - java中十进制数相乘

wpf - 在列表框项目源中时绑定(bind)到 View 模型

linux - 无法从嵌套子 shell 传递变量

javascript - 当引用脱离 JavaScript 中的上下文时,按引用捕获是否会变成按值捕获?

Javascript 作用域 addEventListener 和 this

java - 检测标签的正则表达式

java - JDK8 - 无法解析类型 java.util.Map$Entry

java - 为什么这个没有打印到 Eclipse 的控制台?

java - Windows 保留名称 "c​on"解决方法/hack

javascript - 具有 setTimeout 和clearTimeout 的变量范围