1.使用从控制台读取System.in

在前面的课程中,我们熟悉了在屏幕上显示信息的命令。为此,我们使用了System.out对象及其print()方法println()。简单方便。

但是,正如您可能已经猜到的那样,在屏幕上显示信息对我们来说还不够。大多数程序的目的是为用户做一些有用的事情。这意味着用户经常需要能够从键盘输入数据。

就像输出的情况一样,我们也有一个特殊的数据输入对象 — System.in. 但是,对我们来说不幸的是,它并不像我们想要的那样方便。它让我们一次从键盘读取一个字符的数据。

为了改进这一点,我们将使用另一个类,当与System.in对象配对时,它将为我们提供我们需要的一切。很长一段时间以来,Java 都有适合各种场合的类。我们现在将了解其中的一个。


2.Scanner

Scanner(全称:)java.util.Scanner可以从不同的来源读取数据,例如控制台、文件和互联网。如果我们希望它从键盘读取数据,那么我们必须将System.in对象作为参数传入,该对象将用作数据源。然后 Scanner 对象将弄清楚如何处理它。

使用对象从键盘读取Scanner看起来像这样:

代码 解释
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
我们创建一个Scanner对象。
我们从键盘上读取一行文本。
我们从键盘上 读取了一个数字。

看起来很简单,但真的有那么简单吗?

我想你一定有一堆问题,现在我们来一一解答。

但首先,让我们演示一个使用该类的完整程序示例Scanner

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3.创建Scanner对象

第一个问题是这条线是什么Scanner console = new Scanner (System.in);

这条线可能令人困惑,但你会一直看到类似的东西。所以我们认为解释这里发生的事情很重要。

回想一下我们通常如何用文本创建变量:

String str = "text";
声明和初始化字符串变量

首先,我们写入变量的类型 ( String),然后是它的名称 ( str),最后,在等号之后,我们写入值。

我们的迷惑线其实是一样的:

Scanner console = new Scanner(System.in);
声明和初始化Scanner变量

等号左边的所有内容都是console类型为 的变量声明Scanner。您可以改为调用它s orscanner甚至keyboard. 然后代码将如下所示:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

我认为这让一切都变得更加清晰。

但是等号右边的代码稍微复杂一点。我现在指的是new Scanner(System.in); 也就是说,这里也没有发生任何超自然现象。

在这段代码中,我们告诉 Java 机器:创建一个new类型为 的新对象(关键字)Scanner ,将System.in对象作为新创建Scanner对象的数据源传入。

执行完这一整行后,我们将有一个Scanner名为的变量console ,我们的程序将使用该变量从键盘读取数据。


4. 方法列表

在上面的示例中,我们的Scanner console变量存储了对对象的引用Scanner

要在变量引用的对象上调用方法,请在变量名称后写一个句点,然后是方法名称和任何参数。命令的一般外观如下:

variable.method(arguments);
在变量引用的对象上调用方法

例子:

System.out.println("Hello");
System.out.println(1);

如果您不打算将参数传递给函数,那么您只需编写空括号:

variable.method();
在不传递参数的情况下调用方法

例子:

System.out.println();

5.控制台输入

当我们有一个Scanner对象时,很容易从键盘获取数据。

要从键盘读取一行,你需要这个命令:

String str = console.nextLine();

当程序执行到这一行时,会暂停,等待用户输入数据并回车。然后用户输入的所有内容都存储在变量中str

要从键盘读取一个数字,你需要这个命令:

int number = console.nextInt();

这里的一切都像前面的命令。当程序执行到这一行时,会暂停,等待用户输入数据并回车。之后,用户输入的所有内容都将转换为数字并存储在number变量中。

如果用户输入的数据无法转换为整数,程序将产生错误并退出。

要从键盘读取小数,你需要这个命令:

double number = console.nextDouble();

该语句与nextInt()方法中的语句非常相似,只是它检查输入的数据是否可以转换为数字double

从键盘读取两个数字并在屏幕上显示它们的和的程序示例:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
笔记

用户可以在一行中输入多个数字,用空格分隔:类的方法Scanner知道如何处理这个。也就是说,程序仅在用户按下 后读取数字Enter



6.Scanner类的其他方法

顺便说一句,上面的方法并不是该类Scanner必须提供的全部。完整的方法列表如下所示:

方法 描述
nextByte()
读取数据并将其转换为byte
nextShort()
读取数据并将其转换为short
nextInt()
读取数据并将其转换为int
nextLong()
读取数据并将其转换为long
nextFloat()
读取数据并将其转换为float
nextDouble()
读取数据并将其转换为double
nextBoolean()
读取数据并将其转换为boolean
next()
读取一个“令牌”。令牌由空格或按回车键分隔
nextLine()
读取整行

还有一些方法可以让您检查输入中的下一个标记,而无需实际获取它(以便知道使用哪种方法来读取它)。

方法 描述
hasNextByte()
有吗byte?可以将输入转换为byte?
hasNextShort()
有吗short?可以将输入转换为short?
hasNextInt()
有吗int?可以将输入转换为int?
hasNextLong()
有吗long?可以将输入转换为long?
hasNextFloat()
有吗float?可以将输入转换为float?
hasNextDouble()
有吗double?可以将输入转换为double?
hasNextBoolean()
有吗boolean?可以将输入转换为boolean?
hasNext()
还有其他令牌吗?
hasNextLine()
还有另一条线吗?

7. 从字符串中读取数据

我们之前提到过该类Scanner可以从各种来源读取数据。其中一个来源是一串文本

它看起来像这样:

String str = "text";
Scanner scanner = new Scanner(str);

创建Scanner对象时,我们传入字符串str而不是System.in对象。现在scanner对象将从字符串中读取数据。例子:

程序代码: 解释:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}


// 一个 == 10; 
// b == 20; 
屏幕输出将是:30