Scanner类读取键盘输入(java中Scanner类nextLine()和next()的区别和使用方法&&java 中的Scanner(非常详细不看后悔)):
2017/3/18 在使用这个类时一直有个疑惑,我不明白这个类读取输入是怎么判断输入结束的...., 今天使用时一直在读取命令行的输入,像个智障一样. 感觉还是没有搞明白这个类的具体用法,现在来分析一番
import java.util.Scanner; class Shuchu{ public static void main(String [] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入你的姓名:"); String name = sc.nextLine(); System.out.println("请输入你的年龄:"); int age = sc.nextInt(); System.out.println("请输入你的工资:"); float salary = sc.nextFloat(); System.out.println("你的信息如下:"); System.out.println("姓名:"+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary); } }
上面的代码运行的结果如下:
可以看到 Scanner sc = new Scanner(System.in); 这里并没有造成线程等待,我原来以为会 等待键盘的输入,有意思的是在 String name = sc.nextLine() 这里它在等待键盘的输入, 并且遇到enter键时判断输入结束..., 由此推断出来的结论是 Scanner sc = new Scanner(System.in) 这里 只是实例化了一个以键盘输入为数据源的Scanner对象而已, 还没有开始使用这个玩意儿. 真正使用它的是调用它的一系列next方法, 此时才从键盘读取输入并根据不同的输入符号来判断输入是否结束.比如nextLine()方法就是 遇到 回车 时判断输入结束,返回当前行的其余部分, 不包括结尾处的行分隔符,当前位置移至下一行的行首. nextInt()方法将输入信息的下一个标记扫描为一个 int, 遇到回车返回当前行, 当前位置移至下一行的行首.其余的nextFloat(), nextString() 方法同理.
有两个方法值得注意定位是:hasNext()和next().hasNext()方法的作用是让Scanner从命令行读取输入,还是以回车结束(准确的说是遇到回车返回当前行). 类似其余的next() 方法, 只不过返回值是Boolean型, 而一般的nextXX()方法返回的是键盘的输入值, 可以利用这个方法来从键盘循环读取输入, 不过会造成无限循环, 会一直从键盘读取输入....汗..., 这个时候按 ctrl+C 结束输入. 注意,这是输入,而不是对控制台进行操作。这相当于向控制台输入一个字符,这个字符代表EOF,此时hasNext()方法返回false,循环结束。如果是 sc.hasNext()方法的话, 键盘的输入全部都读到sc里去了(包括回车), 并且当前位置并未移动, 然后再 sc.next()方法的话便可以返回sc里的内容, 同样的会遇到回车符, 然后返回当前行. next()方法默认以空格符号作为输入多个词的空格符, 意思就是 如果在.hasNext()方法输入的是 “11 11 11回车” 的话, next()方法返回的是:
11
后面两个11 并未返回.
注意nextInt()方法和next()方法默以空格分割(我估计其余的nextXXX()方法也是这样,当然默认分割符号可以改), 所以会出出现下面的情况:
至此,总算是搞明白了Scanner这个类的一些用法了, 回答我开始的问题顺便总结下:
1. 判断输入结束--- 与其说是判断输入结束倒不如说是 遇到特定符号返回当前输入, 默认是enter回车符号.
2. 大致过程是 Scanner对象先读取输入, 然后用个当前位置标记一样的东西, 利用nextXXX() 方法从开始往后面扫描, 返回扫描的内容,移动标记位置. nextLine() 扫描到回车键为止, 返回当前行, 当前位置移至下一行的行首. nextInt()方法将扫面到的内容标记为int 遇到分割符或者回车符返回, 移动位置标记. 此后再调用nextXXX()方法便在当前的位置标记基础上,继续往后扫描.
以上个人揣测部分太多......, 如果有错误的话希望大家指点指点下, 共同学习共同进步哈.