我们经常要对一些数据类型进行输入,如byte、int、float、double 或者 String、char. Scanner提供了输入的方法,常用的分为两种:next() 和 nextLine();需要注意的是,两种方法的处理机制不同.
一、next()
next() 会读入指定类型的数据,遇到空白字符结束读取(不会读入空白字符:table,空格,回车),回车会留在控制台。
next()有如下常用方法:
- next(),读取输入的 String 类型.
- nextByte(),读取输入的 byte 类型.
- nextInt(),读取输入的 int 类型.
- nextFloat(),读取输入的 float 类型.
- nextDouble(),读取输入的 double 类型.
Scanner in = new Scanner(System.in);
// String类型
String s = in.next();
// byte类型
byte b = in.nextByte();
// int类型
int n = in.nextInt();
// float类型
float f = in.nextFloat();
// double类型
double d = in.nextDouble();
当输入的类型不符合时,会进行自动类型提升,无法自动类型提升则会报错.
此外,next中没有可以输入char类型的函数.可以通过String类型来接受,再转为char类型,如
Scanner in = new Scanner(System.in);
String s = in.next();
char ch = s.charAt(0);
二、nextLine()
这种就只有它本身:nextLine(),它会读取一行包含空格在内的String类型数据,遇到回车结束,并且回车不会留在控制台。
Scanner in = new Scanner(System.in);
String s = in.nextLine();
三、next()和nextLine两种类型混用
使用next()会把回车留在控制台,留在控制台的回车被之后的nextLine()读取就会使nextLine()还末读取到数据就已经结束读取了。
Scanner in = nwe Scanner(System.in);
int n = in.nextInt(); // 读入数据留下回车符在控制台中结束
String s = in.nextLine(); // 读入控制台的回车符结束
解决方法:
- 依然一起使用,在next()之后,用一个额外的nextLine()读取控制台中的回车符.
- 只使用nextLine(),当想要读入其它类型数据时,使用包装类中的方法转化为该类型.
Scanner in = new Scanner(System.in);
// int类型
int n = Integer.parseInt(in.nextLine());
// double类型
double d = Double.parseDouble(in.nextLine()); // ...其它类似