未分配的可关闭流

时间:2012-10-11 12:15:04

标签: java stream

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

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

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

3 个答案:

答案 0 :(得分:3)

我相信这是一种误报。 Eclipse将它与以下内容混淆:

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

每次执行时都会泄漏一个新的Closeable。

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


  

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

System.in流保持打开状态,直到(大概)应用程序退出。但如果您没有首先调用new Scanner(System.in),情况就没那么了。

答案 1 :(得分:0)

我的回答无效,请参阅评论了解详情。 OP,请接受另一个。

JVM将保持资源处于打开状态,直到您关闭它或程序退出。 Eclipse的警告看起来很好。在Java 7上,您可以使用try-with-resources模式:

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

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

答案 2 :(得分:0)

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

由于Scanner也是CloseableScanner::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;
}