Logo
Section 1 / 2

输入和输出

本节课将教你如何使用 Scanner 类更高效地处理用户输入。

导入

输入和输出

本节课将教你如何使用 Scanner 类更高效地处理用户输入。

Scanner类的演进

我们之前已经了解过如何获取用户输入。使用Scanner类的方法对我们来说并不陌生。然而,我们需要进一步深入探讨这一问题,原因只有一个。

我们的目标是创建交互式软件。在这方面,Scanner类是最新的一项进展,它帮助我们编写更少的代码。在此之前,我们使用的是InputStreamReader。它读取字节并将其转换为字符。InputStreamReader的read()方法会调用底层字节输入流的字节读取操作。
为了提高InputStreamReader的效率,我们会将新的InputStreamReader对象包装在BufferedReader对象中。InputStreamReader的构造函数传入一个System.in对象,用于从键盘读取输入。

因此,整个过程变得相当复杂。为了避免这些复杂性,Java引入了Scanner类,使我们能够轻松地获取用户的输入。

编码示例:82

下面的例子展示了上述复杂性。如果你想重新运行代码,请在终端中输入java main:

No configuration found for ID: efdd3b44e277eeaa34310296e739301e48880f64f63d689d1583a6349180b4b1

代码说明

为了理解读取字节流以及字符转换的底层机制,我们还读取了字符的长度。通常,在for循环语句中,索引从0开始;而while循环语句则从1开始。

如果你在姓名和回车键之间添加空格,程序将多读取两个字节。在此过程中,InputStreamReader充当桥梁,将byte转换为字符。

相反,Scanner是java.util包中的一个类。我们可以使用这个类来获取所有基本数据类型的输入,如int、float、double等,还包括字符串。这是从键盘读取用户输入最简便的方式。

编码示例:83

下面的例子展示了Scanner类如何接收输入并产生输出。输出之后,我们将简要讨论其底层机制。如果你想重新运行代码,请在终端中输入java main:

No configuration found for ID: d9e5237cf0510751d8b69b235f02fcd775a40bcb4a67bf5fb0b112cfbb5471ac

代码说明

以下是输出结果,展示了如何对用户输入进行各种数学运算。

如代码所示,我们把预定义的对象System.in作为参数传递给Scanner的构造函数。System.in对象代表标准输入流。

为了读取特定的基本数据类型,我们使用相应的方法:

  • 对于int,使用nextInt()方法
  • 对于float,使用nextFloat()方法
  • 对于double,使用nextDouble()方法
  • 对于String,使用nextLine()方法

正如你所推测的,还有针对Boolean、Byte、Long和Short的方法。不过,我们通常不需要频繁使用所有这些方法。

作为一个经验法则,我们还可以检查用户输入是否确实是整数。在开发软件或任何网页或移动应用时,用户输入起着至关重要的作用。因此,我们不能完全信任所有用户——万一我们期望输入整数,而用户却输入了一个奇怪的字符串呢?我们必须为此做好准备。

为了检查输入是否为整数,我们可以使用hasNextInt()方法。如果接下来输入的值是整数,该方法返回true。其他数据类型也遵循同样的规则。

在上面的代码中,我们已经对用户输入进行了检查。

编码示例:84

下面的例子将展示相同的方法,但这次我们检查的是字符串输入是否为有效值。如果你想重新运行代码,请在终端中输入java main:

No configuration found for ID: fb51623bfbf9572d21b4f09caadb4bf720ab977afc14f2401458f2e6d90bdfd0

代码说明

我们已将变量name初始化为一个字符串值。现在我们期望用户的输入应与该类型匹配。如果不匹配,系统会提醒用户输入正确的值。

要读取单个字符,可以使用此方法:next().charAt(0)。

算法

自我测验:输入与输出