当在文字模式下要输入数据至程序中时,您可以使用标准输入串流对象System.in,然而我们很少直接使用它,因为System.in对象所提供的 read()方法,是从输入串流取得一个字节的数据,并传回该字节的整数值。
在文字模式下的输入是以字符的方式传送给程序,所以直接使用read()方法取得的是字符的ASCII编码整数,通常要取得的使用者输入会是一个字符串,或是一组数字,所以 System.in对象的read()方法一次只读入一个字节数据的方式并不适用。
在 J2SE 5.0 中,您可以使用java.util.Scanner取得使用者的输 入。
java.util指的是套件(package)层级,java.util.Scanner表示Scanner这个类别是位于java/util这样的阶 层之下,现阶段您可以将这个阶层想象为类似档案管理的目录(数据夹)阶层。
直接先来看如何取得使用者的输入字符串:
import java.util.Scanner; public class UserInput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Please input your name: "); System.out.printf("Hello! %s!", scanner.next()); } }
执行结果:
Please input your name: caterpillar Hello! caterpillar
解释一下程序,java.util套件是J2SE 5.0的标准套件,编译器会知道到哪去找这个套件,您使用"import"是在告诉编译器,您将使用java.util下的 Scanner类别。
"new"表示新增一个Scanner对象,在新增一个 Scanner对象时需要一个System.in对象,因为实际上还是System.in在取得使用者的输入,您可以将Scanner看作是 System.in对象的支持者,System.in取得使用者输入之后,交给Scanner作一些处理(实际上,这是 Decorator 模式 的一个应用)。
简单的说,您告诉执行环境新增一个Scanner对象,然后使用它的next()方法来取得使用者的输入字符串,如果要取得数字呢?您可以使用 Scanner对象的nextInt()方法,例如:
import java.util.Scanner; public class UserInput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Please input a number: "); System.out.printf("Oh! I get %d!!", scanner.nextInt()); } }
nextInt()会将试着取得的字符串转换为int整数,看看执行结果:
Please input a number: 100 Oh! I get 100!!
同样的,您还可以使用Scanner的nextFloat()、nextBoolean()等方法来取得使用者的输入,并转换为正确的 数据型态。
要注意的是,Scanner取得输入的依据是空格符,举凡按下空格键、tab键或是enter键,Scanner就会传回下一个输入,如果您想要取得包 括空格符的输入,比较简单的方法是 使用 BufferedReader 类别取得输入。