Scanner类之常用方法
1.构造方法
构造一个新的
Scanner(InputStream source)
构造一个新的Scanner
,它生成的值是从指定的输入流扫描的。Scanner
,它生成的值是从指定的输入流扫描的。取自该流的字节通过底层平台的 默认字符集转换成字符。
实例:
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System类下的静态字段
static InputStream
in
“标准”输入流。public static final InputStream in
“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
2.常用方法
(1)nextXxx()
获取下一个输入项。Xxx可以是Int,Double等,默认情况下,Scanner使用空格,回车等作为分隔符
①public int nextInt()
int
nextInt()
将输入信息的下一个标记扫描为一个 int。
②public String nextLine()
String
nextLine()
此扫描器执行当前行,并返回跳过的输入信息。此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。
因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的行。
③public String next()
String
next()
查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息。即使以前调用
hasNext()
返回了true
,在等待要扫描的输入时此方法也可能阻塞。
(2)hasNextXxx()
判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx
① public boolean hasNextInt()
boolean
hasNextInt()
如果通过使用nextInt()
方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 int 值,则返回 true。
②public boolean hasNext()
boolean
hasNext()
如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。扫描器将不执行任何输入。
3.nextLine()与next()的异同点
相同点:返回值都是String类型
不同点:
①识别的标识符不同
nextLine()方法只识别行结束符(回车符)
next()在输入有效字符之后,将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
②是否可得到带空格字符
nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.nextLine();
System.out.println(s1);
System.out.print("请输入第二个字符串:");
s2=sc.next();
System.out.println(s2);
结果:
请输入第一个字符串:123 456
123 456
请输入第二个字符串:123 456
123 //其后不包含空格,next方法自动去掉其后标识符
4.nextXxx()和nextLine()连用时出现的问题
如果使用如下程序进行读写,则会出现问题:
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.next();
System.out.println(s1);
System.out.print("请输入第二个字符串:");
s2=sc.nextLine();
System.out.println(s2);
结果:
请输入第一个字符串:123
123
请输入第二个字符串:
Process finished with exit code 0
上述程序将next()和nextLine()顺序交换后,此时我们只输入一次123,程序就执行结束了。这是因为,我们在键盘上录入123时,其实录入的是123和\r\n,next()方法只读取到123就结束了,nextLine()自动读取了被next()去掉的/r/n作为他的结束符,所以没办法从键盘输入值。
经过验证,其他的next的方法,如nextDouble() ,nextFloat() ,nextInt() 等与nextLine()连用时都存在这个问题。
解决办法是:
①在每一个 next()、nextDouble() 、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。
②直接用nextLine()读入所需数据,后面我们会学习将字符串转换为其他类型(整数、浮点数等)的方法。