是否必须关闭扫描仪?

问题描述 投票:0回答:2

使用下面的代码,无论是否使用 Scanner

close
方法,我都能够产生相同的输出。

import java.util.Scanner;
class CheckPassFail
{
    //Write a program called CheckPassFail which prints "PASS" if the int variable "mark" is more than or equal to 50; or prints "FAIL" otherwise.
    static int k;
    static String str;
    public static void main(String arg[])
    {
        System.out.println("Enter the marks : ");
        Scanner typein = new Scanner(System.in);
        str = typein.nextLine();
        typein.close();                             //Scanner Close
        k = Integer.parseInt(str);
        if(k>=50)
        {
            System.out.println("PASS");
        }
        else
        {
            System.out.println("FAIL");
        }
    }
}
java java.util.scanner
2个回答
8
投票

简短的回答:,但在许多情况下非常建议这样做。

扫描仪适用于某种资源。这可以是一个

String
,但在许多情况下,它可以是标准输入通道、文件、网络流或其他资源。

对于

stdin
来说,这不是什么大问题。
stdin
通常与您的应用程序一起存在(和消亡)。最好不要关闭流,因为也许另一个对象有兴趣从标准输入通道读取数据。

但是,如果您从文件/网络/驱动程序/...读取,这意味着 Java 首先询问操作系统是否可以使用该资源。这意味着资源已分配给应用程序。希望写入该文件(或在您的程序应写入该文件的情况下读取和写入)的其他应用程序(至少是暂时的)被拒绝访问该资源。因此尽快放弃资源是很有趣的。

但是最后一个方面不是必须的。 Java 虚拟机将在终止/垃圾收集器经过时关闭程序不再可访问的资源。此外,如果您的Java应用程序被您(另一个程序)杀死(终止),操作系统肯定会释放资源,...

然而,尽快放弃资源是有礼貌的(不要太字面意思,如果你在几(毫秒)秒后释放它们,这并不是一个大问题)。此外,不尽早放弃资源可能会使系统陷入“死锁”或“活锁”。在死锁的情况下,两个程序正在等待一个资源再次可用,同时保留另一个资源。由于没有一个程序放弃自己的资源,因此程序将永远等待。如果发生这种情况,系统就会卡住。 最后,活动资源还会导致额外的内存/CPU 使用。毕竟操作系统管理这些资源,因此可以合理地假设为了管理它们,它们将使用少量的 CPU。在许多情况下,活动文件被(部分)加载到内存中。网络资源也是如此,...一般来说,占用空间不是很大,但是您可以想象,如果所有程序都保留资源直到它们终止,这将产生很大的影响。

不,这不是强制性的,但如果您有 Caller 和 Reader 课程。调用者不应该知道 Reader 的实现。在读者的下一个方法中:


0
投票
while scanner has object read them ( one object per method's call) when objects are done close the reader.


© www.soinside.com 2019 - 2024. All rights reserved.