未分配的可关闭流

  • 本文关键字:分配 java stream
  • 更新时间 :
  • 英文 :


我正在使用Eclipse Juno,当我编写以下代码时,Eclipse警告我可能存在内存泄漏:

String s = new Scanner( System.in ).nextLine();

事实上,我从不关闭 System.in 流。JVM(jre7)如何处理这个问题?这是一个好的用途吗?

我相信这是一个虚惊一场。 Eclipse将其与以下内容混淆:

String s = new Scanner(new FileReader("foo.txt")).nextLine();

每次执行它时都会泄漏一个新的可关闭对象。

但是在您的代码中,基础流 ( System.in ) 仍然可以访问和使用。 当然,没有必要从"资源泄漏"的角度来关闭它。


事实上,我从不关闭 System.in 流。JVM(jre7)如何处理这个问题?

System.in流保持打开状态,直到(大概)应用程序退出。 但是,如果您一开始没有打电话给new Scanner(System.in),那与情况没有什么不同。

我的回答无效,详见评论。 OP,请接受另一个。

JVM 将保持资源打开状态,直到您关闭它或程序退出。 Eclipse的警告看起来是一个很好的警告。 在 Java 7 上,您可以使用"资源试用"模式:

try (Scanner scanner = new Scanner(System.in)) {
    scanner.nextLine();
}

这将在 try 块结束时自动关闭扫描程序。

您可以放心地忽略这一点。

由于Scanner也是Closeable的,并且如果也可以关闭,Scanner::close也会关闭基础读取器。

以下是Scanner::close的代码。

public void close() {
    if (closed)
        return;
    if (source instanceof Closeable) {
        try {
            ((Closeable)source).close();
        } catch (IOException ioe) {
            lastException = ioe;
        }
    }
    sourceClosed = true;
    source = null;
    closed = true;
}

相关内容

  • 没有找到相关文章

最新更新