A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangyinhui 中级黑马   /  2013-4-3 18:11  /  2165 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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,但是为什么要关呢?

6 个回复

倒序浏览
Scanner底层用的是IO流 这里你用了资源 最后你肯定要关掉呀 在说Scanner等于开辟了一个空间 你用完肯定要关掉 不然有引用 无法释放资源 如果你不停的这样 不关资源的话
你内存就会溢出 所以为了安全以及内存的使用 则使用的资源要释放掉
回复 使用道具 举报
这里的scanner其实底层是C或者C++申请的一块具体的内存,当你使用完毕之后,就要关闭,然后释放内存。

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

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

很多下载软件或者视频软件如果你不彻底关,都会自己上传下载从而占用资源,你就会觉得卡,这一个道理.
回复 使用道具 举报
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();
回复 使用道具 举报
上面的代码Scanner 类实例化的时候用了System.in流作为参数,Scanner 的close就是关闭流的。若不关闭会占用一定的内存资源。
scanner.close()为了释放占用的内存资源。
回复 使用道具 举报
  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方法,去通
知系统释放其自身产生的资源。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马