使用Scanner所遇到的问题

来源:互联网 发布:wampserver for mac 编辑:程序博客网 时间:2024/06/07 14:35

Scanner来自 java.util.Scanner 中。
对于我这种菜鸟来说,Scanner主要是用来进行控制台输入。在学习I/O后,了解到BufferedReader也可以进行控制台输入,但是习惯改不过来了,只能继续用Scanner啦!

题外话:使用 BufferedReader 获得控制台输入:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

问题1:.nextXxx() 与 .nextLine()

比如这样一个场景:首先输入一个数字代表接下来需要输入的行数,然后输入数据:

2Emilia 16ram 17

写法:

        Scanner scanner = new Scanner(System.in);        int num = scanner.nextInt();        //scanner.nextLine();            String[] name = new String[num];        int age = new int[num];        int i = 0;        while(scanner.hasNext()){                String[] str = scanner.nextLine().split(" ");                name[i] = str[0].charAt(0);                age[i] = Integer.parseInt(str[1]);//2                i++;            if(i == num){                break;            }        }

如果没有被注释掉的代码,那么 scanner 中的指针就不会指到下一行,会导致下面的str[0]项变为空。
因在 nextXxx() 后紧跟 nextLine() ,会使这个 nextLine() 不会获得任何内容,从而导致2处发生错误。

问题2:Sacnner 与 BufferedReader

java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串。它本质上是使用正则表达式去读取不同的数据类型。

Java.io.BufferedReader类为了能够高效的读取字符序列,从字符输入流和字符缓冲区读取文本。

相对来说,BufferedReader比Scanner快一点,并且支持并发,Scanner不支持。但是scanner在处理输入数字、单个字符、布尔变量时会比前者快一点。
两者的区别:

  • BufferedReader是支持同步的,而Scanner不支持。如果我们处理多线程程序,BufferedReader应当使用。
  • BufferedReader相对于Scanner有足够大的缓冲区内存。
  • Scanner有很少的缓冲区(1KB字符缓冲)相对于BufferedReader(8KB字节缓冲),但是这是绰绰有余的。
  • BufferedReader相对于Scanner来说要快一点,因为Scanner对输入数据进行类解析,而BufferedReader只是简单地读取字符序列。