文章目录
前言
最近搞了很多笔试题,但总是在输入环节耗费很多时间。搜索学习中发现我对Scanner一无所知,遂学习整理了一些Scanner常用的方法和知识点。
一、Scanner是什么?
是一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。 可以自己指定分割的方式,将输入切分,然后可以调用不同的 next 方法,获取你想得到的类型的值。
二、如何使用
构造方法如下:
一般使用键盘输入流传入:
Scanner sc = new Scanner(System.in);
二、常用方法及对比
1.next系列
next系列方法有很多:
常用的包括 next(),nextInt(),nextLine()。
(1)next()和nextInt()一系列
这一系列方法不光是在接收键盘输入的内容,而且还是在进行扫描分割。在遇到有效字符后,会将空格、Tab 键、Enter 键视为结束符,所以 next 系列不能得到带空格的字符串。这类方法会在有输入之前阻塞。
(2)nextLine()
nextLine 以 ENTER 为结束符,也就是返回的是输入回车之前的一行字符,可以包含空格等分隔符。
(3)next系列与nextLine()连用的问题
nextLine方法前面有next系列方法时,nextline会不获取输入。原因如下:
next系列方法根据分隔符(回车,空格等)只取出输入的流中分割的第一部分并解析成对应数据类型,然后把后面的字节传递下去。
传递下来的回车分隔符就被netxLine读到了,所以netxLine读到的字符串就是空字符串。
2.hasNext
问题:当不确定输入个数的时候如何停止接受输入的数据?
这个时候就要用到hasNext了。hasNext() 方法判断输入流里是否还有内容,有的话就返回 true。
hasNext():
- 判断扫描器中当前扫描位置后是否还存在下一段。
- 输出为布尔值。
- 判断输入的缓存中是否有效字符,遇到空格结束。
- 如果只输入空格,不会匹配,返回false。
hasNextLine():
- 如果在此扫描器的输入中存在另一行,则返回 true
- 以Enter为结束符,判断此行有没有输入,空白输入也会返回true。
阻塞问题:当使用输入流构造Scanner的时候,执行到hasNext()时,会先扫描缓冲区中是否有字符,有则返回true,继续扫描。直到扫描为空,这时并不返回false,而是将方法阻塞,等待你输入内容然后继续扫描 。
解决办法:
1,设置一个终止符,调用hasNext()的重载方法hasNext(String patten):如果下一个标记与从指定字符串构造的模式匹配,则返回 true。扫描器不执行任何输入
2,用文件输入,代替输入流
总结
本文只对Scanner常见的用法做了一下简单的阐述,如有问题,多请指正。