
3.6 由键盘输入数据
在程序设计中,经常需要从键盘上读取数据,这时就需要用户从键盘输入数据,从而可以增加与用户之间的交互。利用键盘输入数据,Java语言提供了两种方式。
数据输入方式1:利用键盘输入数据。其基本格式如下:

这个输入数据的基本结构是固定的格式,其中有关输入语句的功能将在第10章介绍。
该格式由键盘输入的数据,不管是文字还是数字,Java皆视为字符串,因此若是要由键盘输入数值则需要利用表3.7中的方法进行相应类型转换。该数据输入格式中的相应语句也可写成如下格式,其作用完全相同。


这种格式中的“str=buf.readLine();”语句是利用buf调用readLine()方法将从键盘上读取的数据均作为字符串来处理,当然也可以利用read()方法从键盘上读取单个的字符型数据。如设c是定义成char型的变量,则“c=(char)buf.read();”语句将是从键盘上读取一个字符,赋给字符型变量c。
下面举例说明如何由键盘输入文字、数字以及两个以上的数据。
1.输入字符串
从键盘输入的所有文字、数字,Java皆视为字符串,因此程序在处理上很简单,只要将输入的内容赋值给一个字符串型变量即可。
【例3.3】 从键盘输入数据。

程序运行结果为:
请输入字符串:Java语言程序设计↙
您输入的字符串是:Java语言程序设计
说明:其中加有下画线的内容是用户从键盘输入的内容,斜箭头号表示回车符,下同。
在程序中,第2行的import命令类似于C/C++语言里的#include,而“import java.io.∗;”则是加载java.io类库里的所有类,以供后面的程序代码使用(程序中的IOException、InputStreamReader与BufferedReader类均属于该类库)。第10行System.out.print()语句的功能与System.out.println()语句的功能基本相同,也是输出括号中的数据,但其不同的是该语句输出数据后不换行。当程序运行到第11行时,会等待用户输入数据,输入完毕后按Enter键,所输入的内容赋给字符串变量str。字符串变量的名称可以是任何合法的Java标识符。
说明:若将该程序的第8行改为“char str;”,第11行改为“str=(char)buf.read();”,则该程序只从键盘上读取一个字符,然后输出。
2.输入数值
由于从键盘输入的数据均被视为字符串,所以若想从键盘上输入数值型数据,必须先利用表3.7中所提供的方法进行类型转换后,字符串的内容才会变成数值。
【例3.4】 从键盘输入数字,然后将其转换成数值型数据。

程序运行结果为:
请输入一个实数:32.58↙
您输入的数为:32.58
程序中的第13行语句是利用parseFloat()方法将从键盘输入的数据,转换为浮点型数据。
3.输入多个数据
对于多个数据的输入与单个数据的输入基本相同,下面是从键盘输入两个整数,然后将其相乘后的结果输出到显示器上。
【例3.5】 从键盘输入多个数据。

请输入第一个数:3↙ 请输入第二个数:6↙ 3∗6=18
程序中的第14、15行为第一个数的输入,第17、18行为第二个数的输入,再赋给适当的变量名及用相应的转换方法进行类型转换即可。
数据输入方式2:为了简化输入操作,从Java SE 5版本开始在java.util类库中新增了一个专门用于输入操作的类Scanner,可以使用该类创建一个对象,然后利用该对象调用相应的方法,从键盘上读取数据。语句格式如下:

Java使用System.out表示标准的输出设备,而用System.in表示标准输入设备。默认情况下,标准输出设备是显示器,而标准输入设备是键盘。为了完成控制台(DOS)输出,只需使用println()方法就可以在控制台上显示输出字符串。Java并不直接支持控制台输入,但可以使用Scanner类创建它的对象,以读取来自System.in的输入,如“Scanner reader=new Scanner(System.in);”。
在上面的语法结构中用创建的reader对象调用nextDouble()方法来读取用户从键盘上输入的double型数据,也可用reader对象调用下列方法,读取用户在键盘上输入的相应类型的数据:nextByte(),nextDouble(),nextFloat(),nextInt(),nextLong(),nextShort(),next(),nextLine()。
上述的nextXXX()方法被调用后,则等待用户从键盘上输入数据并按Enter键(或空格键、Tab键)确认。在从键盘上输入数据时,通常的做法是让reader对象先调用hasNextXXX()方法判断用户在键盘上输入的是否是相应类型的数据,然后再调用nextXXX()方法读取数据。例如,用户在键盘上输入123.45后按Enter键,hasNextFloat()的值为true,而hasNextInt()的值为false。next()或nextLine()方法被调用后,则等待用户在键盘上输入一行文本,即字符串,这两个方法返回一个String类型的数据,String类型将在5.5节讨论。
下面举一个简单的例子,来说明该语句的用法,该语句的其他用法在4.4节讲述循环语句时详细介绍。
【例3.6】 利用Scanner类从键盘输入多个数据。

程序运行结果如下:
请输入第一个数:5↙ 请输入第二个数:8↙ 5∗8.0=40.0
【例3.7】 利用Scanner类,使用next()和nextLine()方法接收从键盘输入字符串型数据。

程序运行结果如下:
请输入第一个数据:abc↙ 请输入第二个数据:xyz↙ 输入的是abc和xyz
说明:next()方法一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键视为分隔符或结束符;而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符。可以将例3.7中的第10行改为调用next()方法,而把第12行改为调用nextLine()方法试一下,以加深理解。