大可制作:QQ群:31564239(asp|jsp|php|mysql)

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 类取得输入