虽然现代的程序都使用 GUI 收集用户的输入,但我们现在只是需要熟悉Java程序设计语言,因此只要有简单的用于输入输出的控制台就可以了。
Java程序的输入输出
这是一件很简单的事情,我们简要描述:
读取输入
想要通过控制台进行输入,首先需要构造一个 Scanner 对象,并与“标准输入流” System.in 关联:
Scanner in = new Scanner(System.in);
现在,就可以使用 Scanner 类的各种方法实现输入操作了。例如, nextLine 方法将输入一行:
System.out.print("What is your name? ");
String name = in.nextLine();
想要读取一个单词(以空白符作为分隔符),就调用 next 方法。
想要读取一个整数,就调用 nextInt 方法:
System.out.print("How old are you? ");
int age = in.nextInt();
类似的,想要读取下一个浮点数,就调用 nextDouble 方法。
Scanner 类定义在 java.util 包中。当使用的类不是定义在基本 java.lang 包时,一定要使用 import 指示字将相应的包加载进来。
import java.util.*;
注释: 因为输入是可见的,所以 Scanner 类不适用于从控制台读取密码。要读取一个密码,可以采用下列代码:
Console cons = System.console(); String username = cons.readLine("User name: "); char[] passwd = cons.readPassword("Password: ");`
对上面注释的思考:
返回的密码存放在一堆字符数组中,而不是字符串中,这样更安全。在对密码进行处理后,应该马上用一个填充值覆盖数组元素。
采用 Console 对象处理输入不如采用 Scanner 方便。每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法。
格式化输出
Java SE 5.0 沿用了 C 语言库函数中的 printf 方法。例如,调用
double x = 1000.0/3.0;
System.out.println(x);
System.out.printf("%8.2f", x);
可以用8个字符的宽度和小数点后2个字符的精度打印 x 。也就是说,打印输出一个空格和7个字符,如下所示:
在 printf 中,可以使用多个参数,例如:
System.out.printf("Hello, %s.Next year, you'll be %d", name, age);
用于 printf 的转换符
转换符 | 类型 | 举例 |
---|---|---|
d | 十进制整数 | 159 |
x | 十六进制整数 | 9f |
o | 八进制整数 | 237 |
f | 定点浮点数 | 15.9 |
s | 字符串 | Hello |
c | 字符 | H |
b | 布尔 | True |
% | 百分号 | % |
另外,还可以给出控制格式化输出的各种标志。例如,逗号标志增加了分组的分隔符。即
System.out.printf("%,.2f", 10000.0/3.0);
结果如下:
用于 printf 的标志
标志 | 目的 | 举例 |
---|---|---|
+ | 打印整数和负数的符号 | +3333.33 |
空格 | 在整数之前添加空格 | / 3333.33/ |
0 | 数字前面补0 | 003333.33 |
- | 左对齐 | /3333.33 / |
可以使用静态的 String.format 方法创建一个格式化的字符串,而不打印输出:
String message = String.format("Hello, %s.Next year, you'll be %d", name,age);
不介绍 printf 方法中日期与时间的格式化选项总感觉缺点什么,下面简要概述:
System.out.printf("%tc", new Date());
这条语句将用下面的格式打印当前的日期和时间:
Non Feb 09 18:05:19 PST 2015
在我电脑中的运行结果截图: