ITEEDU

Java Gossip: 取得使用者输入

当在文字模式下要输入数据至程序中时,您可以使用标准输入串流对象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());
	}
}


执行结果:

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()方法,例如:

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!!",
		scanner.nextInt());
	}
}

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

Please  input a number: 100
Oh! I get  100!!

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

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