Scanner键盘录入
概述
>(green!)
目前在写Java程序的时候,数据都是写死和固定的,有时为了让程序更具有灵活性,就需要灵活的输入数据。
Scanner的作用就是,灵活的从键盘接收数据输入。
但实际开发中的数据,更多是自于前端页面(用户输入,上传等),所以总体而言Scanner对于Web开发并没有太大的实际作用,了解即可。
但是在JavaSE的学习阶段,我们没有前端和各种界面的输入信息,在单机的情况下,使用Scanner键盘录入是很不错的选择,可以提高程序的灵活性。
并且在某些测试的场景中,Scanner键盘录入也有一定的用途,所以Scanner也有必要学习了解一下。
使用步骤
>(green!)
那么Scanner键盘录入到底应该怎么用呢?
大体上可以分为三步走:
导包 (IDEA有自动导包功能,但是不要认为没有这一步)
import java.util.Scanner;
创建对象
Scanner sc = new Scanner(System.in);
接收从键盘录入的数据
int x = sc.nextInt();
注意事项:
目前阶段,记住步骤会使用就行。以后再来具体分析每步在做什么。
一般为了方便使用,应该加上提示键盘输入的输出语句。
参考以下代码案例:
键盘录入int数据
Scanner sc = new Scanner(System.in); // 键盘接收int数据 System.out.println("请输入一个int数据:"); int num = sc.nextInt();
使用Scanner在单独录入数据时,可以选择不同的方法,例如:
- 键盘录入String字符串,可以选择使用nextLine方法。
- 键盘录入int数值,可以选择使用nextInt方法。
- 键盘录入double数值,可以选择使用nextDouble方法。
- …
使用Scanner在需要录入多种数据类型时,建议不要混用以上方法。比如:
使用Scanner不同方法录入多种数据
int num = sc.nextInt(); String str = sc.nextLine();
这种写法实际上是错误的!
推荐在有混合录入多种数据的需求时,永远使用nextLine方法,然后将字符串转换成各种需要的数据类型!
参考以下代码:
统一使用nextLine方法
Scanner sc = new Scanner(System.in); System.out.println("请键盘录入一个int整数:"); String numStr = sc.nextLine(); // 百度查找将String转换成int的方法 int num = Integer.parseInt(numStr); System.out.println("请键盘录入一个字符串:"); String str = sc.nextLine(); System.out.println(num); System.out.println(str);
当然,如果你对上述用法有疑惑,可以继续往下看学习其中的原因。
但Scanner本身就是一个了解内容,知不知道原因是无所谓的!
原因
>(green!)
Scanner的使用问题,next()、nextInt()等一系列方法和nextLine()的区别:
- next()、nextInt()等一系列方法
- next()之类的一系列方法遇见第一个有效字符(非空格,非换行符,非制表符)时,开始扫描
- 当遇见第一个分隔符或结束符(空格、换行符或者制表符)时,结束扫描,获取扫描到的内容
- 即获得第一个扫描到的不含空格、换行符的单个字符串
- nextLine()方法
- 从方法名上就可以看出来,这个方法是获取一行的内容作为一个字符串被接收
- 该方法不会因为空格或制表符号而结束扫描
- 只会因为回车(换行)而结束扫描
>(red!)
由于nextLine()方法碰到换行才结束扫描的特性,所以使用有如下问题:
当使用Scanner接收数值类型后又使用nextLine()方法接收字符串时,例如以下代码:
混用两种Scanner方法
Scanner sc = new Scanner(System.in); sc.nextInt(); sc.nextLine();
输入数值后回车,会导致程序并不会等待并接收一个字符串,而是直接结束键盘录入。究其原因在于,nextLine()方法碰到回车就结束扫描,所以该方法此时接收的实际上是一个(绝对)空字符串。
解决的办法有很多种:
可以使用不同的Scanner对象接收,这样肯定不存在冲突问题
在接收int数据的后面加一个不接收数据的nextLine用来接收回车
用next()方法接收字符串,但是需要注意该方法以分隔符结束,不再是接收一行了
可以统一用字符串接收数值类型,接收完毕后再进行类型转换。(具体怎么做,可以自行百度一下)
例如转换成int类型(传入一个字符串,转换成int接收即可)
Integer.parseInt()
练习
>(red!)
三道简单的练习题
- 键盘录入两个int数据,并对这两个int数据求和,输出其结果。
- 键盘录入两个数值,获取这两个数据中的最大值。
- 键盘同时录入三个数据,分别为int类型、String类型,double类型,应该怎么做?
>(green!)
参考代码如下:
参考代码1
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入两个int数值:"); int num1 = sc.nextInt(); int num2 = sc.nextInt(); System.out.println("这两个数值的和是:" + (num1 + num2)); }
参考代码2
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入两个int数值:"); int num1 = sc.nextInt(); int num2 = sc.nextInt(); System.out.println("这两个数值的最大值是:" + ((num1 > num2) ? num1 : num2)); }
参考代码3
public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 混合录入数据类型时,统一使用nextLine方法 System.out.println("请输入一个int整数:"); String numStr = sc.nextLine(); int num = Integer.parseInt(numStr); System.out.println("请输入一个字符串:"); String str = sc.nextLine(); System.out.println("请输入一个double数据:"); String doubleStr = sc.nextLine(); double doubleNum = Double.parseDouble(doubleStr); }