Scanner
类的对象来获取用户的输入首先定义一个Scanner
类的对象,名称任意,此处以sca
为例
Scanner sca = new Scanner(System.in);
sca
的输入流缓冲区里就用来保存用户在控制台输入的数据
sca
不同于C++中的cin
,它不是一个全局变量,有作用域,不过一个作用域里有一个Scanner类的对象就够用了,因为只需要一个缓冲区就可以获得输入流的所有数据
用户再控制台输入数据之后,按下回车,将数据送入sca
的输入流缓冲区
跟C++的
cin
一样Java的
src
输入流缓冲区保存数据是按照字符串进行保存的
通过Scanner
的成员方法将Scanner
对象输入流缓冲区的数据赋值给变量
有几种常用的成员方法
以Scanner
的对象sca
为例:
sca.next()
这个成员方法是 返回sca
的输入流缓冲区的分隔符之前的数据,返回值类型是字符串。数据被返回后,流出缓冲区
此时,分隔符是空格' '
、tab'\t'
、换行符'\n'
并且此时如果分隔符在有效数据之前,会自动将分隔符忽略掉,直到获取的数据是有效数据而不是分隔符 比如 String a = sca.next();如果输入
" A"
(A之前很多空格),A
是才有效数据,A
之前的空格是分隔符,在从cin
的输入流缓冲区获取数据的时候,会自动忽略A
之前的分隔符空格,只获取有效数据A
比如:
在控制台输入"1 2 3 4 5 6 7"
(数字之间有空格),按下回车,添加回车符到数据中,"1 2 3 4 5 6 7'\r'"
,数据被送入sca
的输入流缓冲区,回车符'\r'
在缓冲区变成了换行符'\n'
,此时缓冲区里的数据为"1 2 3 4 5 6 7'\n'"
执行
String i = sca.next();
将sca
的输入流缓冲区换行符,空格' '
,之前的数据1
作为返回值赋值给i
,并流出缓冲区,缓冲区剩余数据为"2 3 4 5 6 7'\n'"
sca.nextLine()
获取src
输入流缓冲区中的一行数据,也就是’\n'
之前的所有数据,包括空格。返回值类型是字符串,字符串中包括空格。此时空格' '
就不是分隔符了,分隔符是'\n'
比如:
如果接着上面的代码,先在控制台输入"hello world"
并按下回车送入缓冲区,此时sca
输入流缓冲区中的数据是"2 3 4 5 6 7'\n'hello world'\n'"
执行
String x = sca.nextLine();
String y = sca.nextLine();
先是x
获取到缓冲区换行符之前的所有数据,也就是"2 3 4 5 6 7"
,sca
输入流缓冲区剩余的数据是””hello world'\n'"
之后y
获取缓冲区换行符之前的所有数据,即"hello world"
,sca
缓冲区没有剩余数据了,为空
sca
缓冲区中的数据是按照字符串存储的,如果想要按照指定的类型从缓冲区中获取数据,使用以下函数
方法 | 描述 |
---|---|
nextBoolean() | 从缓冲区获取数据,并转化为boolean布尔值返回 |
nextByte() | 从缓冲区获取数据,并转化为byte字节值返回 |
nextDouble() | 从缓冲区获取数据,并转化为double双精度值返回 |
nextFloat() | 从缓冲区获取数据,并转化为float浮点值返回 |
nextInt() | 从缓冲区获取数据,并转化为int值返回 |
nextLine() | 从缓冲区读取String字符串值 |
nextLong() | 从缓冲区读取long值 |
nextShort() | 从缓冲区读取short值 |
使用这类函数的前提是输入流缓冲区里的数据是能转化成相应的类型
比如缓冲区里的"123"
可以转化为int
类型的123
,但是"A"
并不能转化为int
类型,如果要转化成int
类型,只有数字字符串才可以
比如 Scanner sca = new Scanner(System.in); int i = sca.nextInt(); System.out.println(i);
所以某种程度上,使用此类成员函数可以提升数据安全性
防止用户输入数据类型不匹配而出错