当在文字模式下要输入数据至程序中时,您可以使用标准输入串流对象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这样的阶层之下,现阶段您可以将这个阶层想像为类似文件管理的目录(数据夹)阶层。


直接先来看如何取得使用者的输入字符串:

  • UserInput.java

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()); }}


执行结果:


解释一下程序,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()方法,例如:

  • UserInput.java

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!! mysite:http://www.infocool.net", scanner.nextInt()); }}


nextInt()会将试着取得的字符串转换为int整数,看看执行结果:


同样的,您还可以使用Scanner的nextFloat()、nextBoolean()等方法来取得使用者的输入,并转换为正确的 数据类型。


要注意的是,Scanner取得输入的依据是空白字节,举凡按下空白键、tab键或是enter键,Scanner就会传回下一个输入,如果您想要取得包括空白字节的输入,比较简单的方法是 使用 BufferedReader 类取得输入。

Please input your name: caterpillar

Hello! caterpillar!