首页 > 编程笔记 > Java笔记 阅读:23

Java输入和输出语句的用法(附带实例)

为了让 Java 程序更加生动有趣,它们应该能够与用户进行交互。本节教会读者如何读取终端输入,以及如何实现格式化输出。

Java读取输入

当调用 System.out.println 时,输出被发送到“标准输出流”,从而在终端窗口中显示出来。如果要从“标准输入流”读取信息则没那么简单,因为对应的 System.in 对象只有一些读取单个字节的方法。

为了读取字符串和数字,还需要构造一个能够连接到 System.in 对象的 Scanner:
var in = new Scanner(System.in);

nextLine() 方法能够读取一整行输入:
System.out.println("What is your name?");
String name = in.nextLine();
这里使用 nextLine() 方法的主要原因是输入中可能包含空格。如果要读取由空格分隔的单个单词,需要调用:
String firstName = in.next();

如果要读取整数,可以使用 nextInt() 方法:
System.out.println("How old are you?");
int age = in.nextInt();

类似地,你也可以使用 nextDouble() 方法读取下一个浮点数。可以使用 hasNextLine()、hasNext()、hasNextInt() 和 hasNextDouble() 方法检查是否有新的行、单词、整数或浮点数可用:
if (in.hasNextInt()) {
    int age = in.nextInt();
    ...
}

Scanner 类位于 java.util 包中,为了使用这个类,应当在程序的开头添加以下代码:
import java.util.Scanner;

如果要读取密码,你可能就不会想使用 Scanner 类了,因为 Scanner 类会使得输入在终端中可见。建议使用 Console 类,示例如下:
Console terminal = System.console();
String username = terminal.readLine("User name: ");
char[] passwd = terminal.readPassword("Password: ");
这样用户输入的密码将以字符数组形式返回。这比将密码存储在 String 中更安全,因为可以在读取操作完成后重新处理数组。

如果你想从文件中读取输入或将输出写入文件,可以使用 shell 的重定向语法:
java mypackage.MainClass < input.txt > output.txt
现在 System.in 将会从 input.txt 中读取信息,System.out 向 output.txt 中写入信息。

Java格式化输出

你已经看到了 System.out 对象中的 println() 方法,可以用于编写一行输出。此外还有一种 print() 方法,该方法的输出不会每次输出都开始新的一行。该方法通常用于输入提示:
System.out.print("Your age: "); // Not println
int age = in.nextInt();
这样光标将会停留在提示信息之后,而不是下一行。

当你使用 print() 或 println() 方法打印一个小数时,除末尾的零以外的所有数字将会被显示。例如:
System.out.print(1000.0 / 3.0);
将会打印:

333.333333333333

但是,如果你想显示美元和美分,这就会是一个问题了。为了限制输出位数,可以这样使用 printf() 方法:
System.out.printf("%8.2f", 1000.0 / 3.0);
格式化串(format string)"%8.2f"表示的含义是,以 8 个字段宽度(field width)和 2 位精度(precision)的形式打印浮点数。也就是说,最终打印输出中会包含 2 个前导空格和 6 个字符:

  333.33


你还可以为 printf() 提供多个参数。例如:
System.out.printf("Hello, %s. Next year, you'll be %d.\n", name, age);
每个以 % 字符开头的格式说明符(format specifier)都将被替换为相应的参数。格式说明符的末尾是转换说明符(conversion character),表示要格式化的值的类型:f 表示浮点数,s 表示字符串,d 表示十进制整数。下表列出了所有转换说明符。

表:格式化输出的转换说明符
转换说明符 功能 示例
d 十进制整数 159
x 或者 X 十六进制整数(有关十六进制格式的更多信息,请使用 Hexformat 类) 9f 或者 9F
o 八进制整数 237
f 固定型浮点数 15.9
e 或者 E 指数型浮点数 1.59e+01 或者 1.59E+01
g 或者 G 通用型浮点数:如果指数大于精度要求或指数 < -4,则为 e/E,否则为 f/F 15.9000,默认精度 6 位;2e+01,精度为 1
a 或者 A 十六进制浮点数 0x1.fccdp3 或者 0X1.FCCDP3
s 或者 S 字符串 Java 或者 JAVA
c 或者 C 字符 j 或者 J
b 或者 B boolean false 或者 FALSE
h 或者 H 哈希码 42628b2 或者 42628B2
t 或者 T 日期和时间(已过时) -
% 百分号 %
n 平台相关的行分隔符 -

此外,你可以指定标志符来控制格式化输出的外观。下表列出了所有标志符:

表:格式化输出标志
标志符 功能 示例
+ 打印正数或者负数的标志 +3333.33
空格 在正数前添加空格 _3333.33
- 左对齐标记 3333.33---
0 添加前导 0 003333.33
( 将负值括在括号中 (3333.33)
, 使用分组符号 3,333.33
#(针对 f 或者 e 格式) 始终包含小数点 3333.
#(针对 x 或者 o 格式) 添加 0x 或者 0 前缀 0xcafe
$ 指定要格式化的参数的索引。例如,%1$d %1$x 将以十进制和十六进制打印第一个参数 159 9f
< 格式化前面说明的数值。例如,%d %<x 表示以十进制和十六进制打印同一个数字 159 9f

例如,逗号标志可以添加分组分隔符,+ 符号会为正数添加正数符号。以下语句:
System.out.printf("%,+.2f", 100000.0 / 3.0);
将会打印:

+33,333.33


你也可以使用 formatted()方法创建格式化字符串,而无须打印它:
String message = "Hello, %s. Next year, you'll be %d.\n".formatted(name, age);

相关文章