ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

2021/9/22-java中Scanner对象的关闭使用

2021-09-22 23:36:42  阅读:181  来源: 互联网

标签:调用 java Scanner 22 System 关闭 sc close


如果在代码中关闭了Scanner,也就是调用了Scanner.close()这个方法,那么在接下来的代码中将无法再使用Scanner,即便再次声明了一个新的Scanner对象也是如此。

首先Scanner的close()方法会关闭System.in,也就是Scanner对象在被初始化时所传入的参数。

System.in是一个final常量,所以在整个方法中只会被实例化一次。

这也就导致了在第二次创建Scanner对象的时候并没有一个全新的System.in被传入,而是一个已经被关闭了的System.in。

那么是否能够重新打开System.in呢?

就目前查到的资料中表示System.in在被关闭后并不能重新打开,对于具体原因还不清楚。

所以如果要关闭Scanner的话一定要确保在同一方法下接下来不会再调用Scanner来接受输入。

接下来是为什么要关闭Scanner。

我们之所以要关闭Scanner是因为System.in在被第一次声明时会打开InputStream,而输入流是非常占据内存的,为此我们通常为了节省内存考虑会选择调用Scanner.close()来关闭输入流,从而节省内存。

如果一个方法中创建了Scanner对象,却没有关闭,那么在方法结束后,Scanner对象虽然会进入被回收的队列中,但不是立刻回收。而这会给计算机带来一定的负担,为了避免造成大量的内存占据,至少在方法结束前应该调用Scanner的close()方法。

例如:

public int run(){

Scanner sc = new Scanner(System.in);//创建Scanner对象

int i = sc.nextInt();

//代码块(其中再次调用了sc)

sc.close()//关闭Scanner,也就是关闭输入流

//如果不写sc.close()的话尽管sc同样会在一段时间后被回收,但如果run函数被大量重复调用的话,就会导致一定程度的内存浪费

return i;

}

需要注意的是,如果函数中有多个地方可能会结束方法,那么要在每次结束前确保Scanner对象被close了。

但如果能够保证接下来的部分不会在运用到Scanner,也可以提早进行Scanner的close()方法的调用。

这也就是为什么Scanner的close()不是总被放在最后的原因。

同时Scanner在方法中也占据了一定的内存,会影响到运行,能够及早释放也会更好。

例如:

public int run(){

Scanner sc = new Scanner(System.in);//创建Scanner对象

int i = sc.nextInt();

sc.close()//关闭Scanner

//代码块(其中没有调用sc)

return i;

}

这样可以进一步节省内存,也保证了不用担心后面会出现突然结束方法而没有关闭Scanner的情况。

ps:虽然这样就要注意是否要再次调用Scanner了。

标签:调用,java,Scanner,22,System,关闭,sc,close
来源: https://www.cnblogs.com/-yi123/p/15322283.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有