Java 扫描程序 - 垃圾收集

Java Scanner - Garbage Collection

我需要关闭这段代码中的扫描仪吗?

public static String input(final String out){
System.out.print(out);
java.util.Scanner sc = new Java.util.Scanner(System.in);
return sc.nextLine();

检查

进口java.util.Scanner; public 静态字符串输入(最终字符串输出) { 字符串 str=""; System.out.print(出局); 扫描仪 sc = 新扫描仪 (System.in); 同时(sc.hasNextLine()){ str=sc.nextLine();

}

    return str; 
}

不,您不需要关闭它。 (即使您的 IDE 说您愿意!)

您不需要的原因是 您的代码 不负责打开 System.in。 JVM 在启动时就这样做了。

一般原则是让打开资源的代码负责关闭资源。在这种情况下,在调用 input returns 之后,应用程序的其他部分仍然可以访问 System.in。可能需要用到,但是这里关闭了就不能用了。调用 Scanner.close() 将尝试关闭它正在包装的任何源。


但是,由于其他原因,您的代码(可能)是错误的。如果你要为 System.in 创建一个 Scanner,你应该这样做 "globally",而不是在一些可以从很多地方调用的方法中。

为什么?

因为您只能将给定的输入流对象安全地包装在 Scanner 中一次。

  1. Scanner 控制流的生命周期。
  2. Scanner可能从流中预读缓冲区任意数量的字符,使它们对其他东西不可用;例如另一个 Scanner。因此,两个 Scanners 尝试从同一个流中读取可能会意外丢失字符。

关闭 Scanner 将关闭包装的源代码,无论您是明确地还是通过 try-with-resources 这样做。但是,Scanner 不可终结...这意味着 GC 不会仅仅因为 Scanner 变得无法访问而尝试关闭包装的源。