java.util.Scanner 类是一个简单的文本扫描器可以分析基本类型和字符串使用正则表达式。以下是关于扫描器的要点:

  • 一个扫描器使用分隔符模式分解它的输入,默认情况下与空白匹配。
  • 扫描操作可能阻塞等待输入。
  • 扫描器是不是安全的,无需外部同步多线程使用。

java的scanner类常用成员函数,方法:

Scanner 被称为输入流扫描器类,从控制台读取数据的 构造方法 如下:Scanner input = new Scanner(System.in)

boolean hasNext()  如果此扫描器有另一个标记在其输入此方法返回true。

String next()  此方法查找并返回来自此扫描器的下一个完整标记。

int nextInt()  此方法扫描输入的下一个标记为int。

String nextLine()  此方法前进此扫描器执行当前行,并返回跳过的输入信息。

java的scanner类实现机制:

Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格啊,回车啊什么的都算做是空白符。

nextInt()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中,但是,nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉。

注意!!!

不同函数(方法)的结束标志是不一样的!nextint的结束标志是空白符,而nextline的结束标志是回车。

常见问题及解决方案:

1.先用nextInt()再用nextLine()不会有接收字符串:

nextInt()方法之后在缓冲区中留下了“\r”,然后nextLine()方法再去缓冲区找数据的时候首先看到了“\r”,然后就把这个“\r”扫描接收进来,并在缓冲区内清除掉。其实,nextLine()方法是执行过的,并没有不执行。

可以再nextInt()方法后面多加一句nextLine()方法专门用来取出缓冲区中留下的空白符;

可以只用nextLine()方法,然后通过Integer类中的parseInt()方法解析成int数据。因为nextLine()方法会自动清理掉后边的空白符,这种方法就不会产生最开始那种错误了。

2.重新确定自己的输入分隔符

Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符:

s.useDelimiter(" |,|\\.");

3.判断控制台输入结束:

String line = s.nextLine();    if (line.equals("exit")) break;