黑马程序员技术交流社区

标题: Scanner [打印本页]

作者: yangyinhui    时间: 2013-4-3 18:11
标题: Scanner
本帖最后由 yangyinhui 于 2013-4-4 15:05 编辑

public static void main(String[] args) {
                 System.out.println("请输入:");
                Scanner scanner =new Scanner(System.in);
                int x =scanner.nextInt();
                System.out.println(x);
                scanner.close();这段代码我知道是为了关闭Scanner,但是为什么要关呢?
作者: 赵亚威    时间: 2013-4-3 18:56
Scanner底层用的是IO流 这里你用了资源 最后你肯定要关掉呀 在说Scanner等于开辟了一个空间 你用完肯定要关掉 不然有引用 无法释放资源 如果你不停的这样 不关资源的话
你内存就会溢出 所以为了安全以及内存的使用 则使用的资源要释放掉
作者: 胡国彬    时间: 2013-4-3 22:57
这里的scanner其实底层是C或者C++申请的一块具体的内存,当你使用完毕之后,就要关闭,然后释放内存。

楼上说,如果不关闭会造成内存溢出,这个是不准确的,应该是造成内存泄漏。

其实java底层有GC去释放不用的内存,但是像流,以及数据库连接之类的,需要手动的去关闭,因为,GC是不会去主动关闭这些使用的连接的。
作者: lucy198921    时间: 2013-4-4 10:17
凡是属于IO流的类如果不关闭会一直占用资源.要养成好习惯用完就关掉.就好像你接水完了要关水龙头一样.

很多下载软件或者视频软件如果你不彻底关,都会自己上传下载从而占用资源,你就会觉得卡,这一个道理.
作者: 随便    时间: 2013-4-4 10:49
Scanner的一个构造方法,因为是接受键盘输入,System.in,所以是这个方法。
  1.     public Scanner(InputStream source) {
  2.         this(new InputStreamReader(source), WHITESPACE_PATTERN);
  3.     }
复制代码
Scanner.close内部代码。
  1.     public void close() {
  2.         if (closed)
  3.             return;
  4.         if (source instanceof Closeable) {
  5.             try {
  6.                 ((Closeable)source).close();
  7.             } catch (IOException ioe) {
  8.                 lastException = ioe;
  9.             }
  10.         }
  11.         sourceClosed = true;
  12.         source = null;
  13.         closed = true;
  14.     }
复制代码
输入流需要关闭资源这下就明白了吧。
还有就是熟悉了输入输出流。就可以使用

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
br.close();

作者: 奋斗2013    时间: 2013-4-4 12:19
上面的代码Scanner 类实例化的时候用了System.in流作为参数,Scanner 的close就是关闭流的。若不关闭会占用一定的内存资源。
scanner.close()为了释放占用的内存资源。
作者: 王川    时间: 2013-4-4 14:33
  1.         InputStream in = System.in;
  2.         Scanner scan = new Scanner(in);
  3.         System.out.println(scan.nextInt());
  4.         //scan.close();
  5.         
  6.         Scanner scan2 = new Scanner(in);
  7.         System.out.println(scan2.nextInt());
复制代码
关闭扫描器是为了关闭底层的输入流对象。
当我们在程序中创建一个IO流对象的时候,同时系统也会创建
一个叫做流的东西,在这种情况下,计算机内存中实际产生了两个事物,一个是java程
序中类的实例对象,一个是系统本身产生的某种资源,而java垃圾回收器只能管理程序
中类的实例对象,没办法去管理系统产生的资源,所以程序需要调用close方法,去通
知系统释放其自身产生的资源。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2