是否必须关闭扫描仪?

时间:2015-03-11 00:23:29

标签: java java.util.scanner

使用以下代码,我可以使用/不使用扫描仪关闭方法生成相同的输出。

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");
        }
    }
}

2 个答案:

答案 0 :(得分:5)

简短回答:,但在许多情况下非常明智这样做。

扫描仪适用于某种资源。这可以是String,但在许多情况下,它可以是标准输入通道,文件,网络流或其他资源。

stdin来说,这不是什么大问题。 stdin通常与您的申请一起生活(并死亡)。最好不要关闭流,因为可能另一个对象有兴趣从标准输入通道读取。

如果您从files / network / driver /中读取...这意味着Java首先询问操作系统是否可以使用该资源。这意味着资源已分配给应用程序。其他希望写入文件的应用程序(或者在程序写入文件时读取和写入)是(至少是临时的)拒绝访问该资源。因此,尽快放弃资源是有意义的。

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

然而,尽快放弃资源是很有礼貌的(不要太过于字面意思,如果你在几秒钟后释放它们,这不是一个大问题)。此外,不及早放弃资源可以使系统进入死锁活锁。在死锁的情况下,两个程序正在等待资源在保持其他资源时再次可用。由于没有一个程序放弃自己的资源,程序将永远等待。如果发生这种情况,系统会卡住。

最后,活动资源也会导致额外的内存/ CPU使用量。在所有操作系统管理这些资源之后,因此可以合理地假设要管理它们,它们将使用少量的CPU。在许多情况下,活动文件(部分)加载到内存中。网络资源也是如此......总的来说,足迹并不是非常庞大,但你可以想象如果所有程序在资源终止之前都会保留资源,这会产生很大的影响。

答案 1 :(得分:1)

不,它不是强制性的,但如果您有Caller和Reader类。来电者不应该知道Reader的实现。在读者的下一个方法中:

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