购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

bt2-L 1.6 输入和输出

为了让示例程序更加生动有趣,它们应该能够与用户进行交互。在下面的小节中,你将了解如何读取终端输入,以及如何实现格式化输出。

1.6.1 读取输入

当调用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中写入信息。你将在第9章中看到如何执行更加通用的文件输入和输出操作。

1.6.2 格式化输出

你已经看到了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表示十进制整数。表1-5列出了所有转换说明符。

表1-5  格式化输出的转换说明符

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

表1-6  格式化输出标志

例如,逗号标志可以添加分组分隔符,+ 符号会为正数添加正数符号。以下语句:

System.out.printf("%,+.2f", 100000.0 / 3.0);

将会打印

+33,333.33

你也可以使用formatted方法创建格式化字符串,而无须打印它: NVXVG9xr/9Rj6O9pmyr8jx9WN8vIYNBsGNrf6g+uZXjNP5dsjRWojGOTqtA8uZIe

String message = "Hello, %s. Next year, you'll be %d.\n".formatted(name, age);
点击中间区域
呼出菜单
上一章
目录
下一章
×