Java 没有流时是否需要关闭扫描仪?

Java 没有流时是否需要关闭扫描仪?,java,java.util.scanner,Java,Java.util.scanner,直接从此扫描仪: 我不这么认为,但最好还是关闭它,以防您将代码更改为使用流。这也是一个好习惯,一个你真正想要养成的习惯 首先,我们养成习惯;那么,我们的习惯使我们变得更聪明 我会说关闭流,因为像关闭最后块中的资源这样的习惯根深蒂固是有意义的。如果我们不关闭字符串的扫描器,就不会有资源泄漏。内部new Scanner(String)创建一个StringReader作为底层源,当我们关闭Scanner时,它会关闭StringReader,但不会产生任何效果。如果您想将Scanner标记为关闭(以便对

直接从此扫描仪:


我不这么认为,但最好还是关闭它,以防您将代码更改为使用流。这也是一个好习惯,一个你真正想要养成的习惯

首先,我们养成习惯;那么,我们的习惯使我们变得更聪明


我会说关闭流,因为像关闭
最后
块中的资源这样的习惯根深蒂固是有意义的。

如果我们不关闭字符串的
扫描器
,就不会有资源泄漏。内部
new Scanner(String)
创建一个
StringReader
作为底层源,当我们关闭
Scanner
时,它会关闭
StringReader
,但不会产生任何效果。

如果您想将Scanner标记为关闭(以便对对象的所有后续操作都会立即失败),然后您必须调用Scanner.close()

我认为使用Scanner.close()是个好主意;
我这样说是因为它可以防止资源泄漏,如果你养成了这样的习惯,那么它将对你非常有益。

即使扫描器不是一个流,你也需要关闭它,以表明你已经完成了它的底层流。像Eclipse这样的IDE经常会发出警告,警告您“资源泄漏:'扫描仪'从未关闭”


注意:不要关闭连接到系统的扫描仪。在中!因为System.in对象是由JVM打开的,所以应该让JVM来关闭它。

最好在使用完资源后立即关闭它们,否则编译器会抱怨内存泄漏并咕哝错误。
String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close();