# Java `Scanner`类

> 原文： [https://www.programiz.com/java-programming/scanner](https://www.programiz.com/java-programming/scanner)

#### 在本教程中，我们将借助示例学习 Java 扫描器及其方法。

`java.util`包的`Scanner`类用于从不同的源（例如输入流，用户，文件等）读取输入数据。让我们举个例子。

* * *

## 示例 1：使用扫描器读取一行文本

```java
import java.util.Scanner;

class Main {
    public static void main(String[] args) {

        // Creates an object of Scanner
        Scanner input = new Scanner(System.in);

        System.out.print("Enter your name: ");

        // Takes input from the keyboard
        String name = input.nextLine();

        // Prints name
        System.out.println("My name is " + name);

        // Closes the scanner
        input.close();
    }
} 
```

**输出**

```java
Enter your name: Jack
My name is Jack 
```

在上面的示例中，请注意以下行

```java
Scanner input = new Scanner(System.in); 
```

在这里，我们创建了一个名为`input`的`Scanner`对象。

`System.in`参数用于从标准输入中获取输入。 就像从键盘上获取输入一样。

然后，我们使用`Scanner`类的`nextLine()`方法从用户读取一行文本。

现在您对`Scanner`有了一些了解，让我们对其进行更多的探索。

* * *

## 导入扫描器类

从上面的示例中可以看到，我们需要先导入`java.util.Scanner`包，然后才能使用`Scanner`类。

```java
import java.util.Scanner; 
```

* * *

## 用 Java 创建扫描器对象

如上所述，导入包后，就可以创建`Scanner`对象。

```java
// To read input from the input stream
Scanner sc1 = new Scanner(InputStream input);

// To read input from files
Scanner sc2 = new Scanner(File file);

// To read input from a string
Scanner sc3 = new Scanner(String str); 
```

在这里，我们创建了`Scanner`类的对象，这些对象将从 [InputStream](https://www.programiz.com/java-programming/inputstream "InputStream") ，文件和字符串中分别读取输入。

* * *

## Java 扫描器输入方法

`Scanner`类提供了各种方法，使我们可以读取不同类型的输入。

| 方法 | 描述 |
| --- | --- |
| `nextInt()` | 从用户读取`int`值 |
| `nextFloat()` | 从用户读取`float`值 |
| `nextBoolean()` | 从用户读取`boolean`值 |
| `nextLine()` | 从用户读取一行文本 |
| `next()` | 读取用户的单词 |
| `nextByte()` | 从用户读取`byte`值 |
| `nextDouble()` | 从用户读取`doubl`e 值 |
| `nextShort()` | 从用户读取`short`值 |
| `nextLong()` | 从用户读取`long`值 |

* * *

### 示例 2：Java 扫描器`nextInt()`

```java
import java.util.Scanner;

class Main {
    public static void main(String[] args) {

        // creating a Scanner object
        Scanner input = new Scanner(System.in);

        System.out.println("Enter an integer: ");

        // read an int value
        int data1 = input.nextInt();

        System.out.println("Using nextInt(): " + data1);

        input.close();
    }
} 
```

**输出**：

```java
Enter an integer:
22
Using nextInt(): 22 
```

在上面的示例中，我们使用`nextInt()`方法读取整数值。

* * *

### 示例 3：Java 扫描器`nextDouble()`

```java
import java.util.Scanner;

class Main {
   public static void main(String[] args) {

      // creates an object of Scanner
      Scanner input = new Scanner(System.in);
      System.out.print("Enter double value: ");

      // reads the double value
      double value = input.nextDouble();
      System.out.println("Using nextDouble(): " + value);

      input.close();
   }
} 
```

**输出**：

```java
Enter double value: 33.33
Using nextDouble(): 33.33 
```

在上面的示例中，我们使用`nextDouble()`方法读取浮点值。

* * *

### 示例 4：Java 扫描器`next()`

```java
import java.util.Scanner;

class Main {
   public static void main(String[] args) {

      // creates an object of Scanner
      Scanner input = new Scanner(System.in);
      System.out.print("Enter your name: ");

      // reads the entire word 
      String value = input.next();
      System.out.println("Using next(): " + value);

      input.close();
   }
} 
```

**输出**：

```java
Enter your name: Jonny Walker
Using next(): Jonny 
```

在上面的示例中，我们已使用`next()`方法从用户读取字符串。

在这里，我们提供了全名。 但是，`next()`方法仅读取名字。

这是因为`next()`方法最多读取**空白**字符的输入。 一旦遇到**空格**，它将返回字符串（不包括空格）。

* * *

### 示例 5：Java 扫描器`nextLine()`

```java
import java.util.Scanner;

class Main {
   public static void main(String[] args) {

      // creates an object of Scanner
      Scanner input = new Scanner(System.in);
      System.out.print("Enter your name: ");

      // reads the entire line
      String value = input.nextLine();
      System.out.println("Using nextLine(): " + value);

      input.close();
   }
} 
```

**输出**：

```java
Enter your name: Jonny Walker
Using nextLine(): Jonny Walker 
```

在第一个示例中，我们使用`nextLine()`方法从用户读取字符串。

与`next()`不同，`nextLine()`方法读取包括空格在内的整行输入。 当遇到下一个行字符`\n`时，该方法终止。

**推荐阅读**： [Java 扫描器跳过`nextLine()`](https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo "Java Scanner skipping the nextLine()")。

* * *

## Java 扫描器和`BigInteger`和`BigDecimal`

Java 扫描器还可以用于读取大整数和大十进制数。 要了解`BigInteger`和`BigDecimal`，请访问 Java `BigInteger`和 Java `BigDecimal`。

*   `nextBigInteger()` - 从用户读取大整数值
*   `nextBigDecimal()` - 从用户读取大十进制值

* * *

### 示例 4：读取`BigInteger`和`BigDecimal`

```java
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

class Main {
   public static void main(String[] args) {

      // creates an object of Scanner
      Scanner input = new Scanner(System.in);
      System.out.print("Enter a big integer: ");

      // reads the big integer
      BigInteger value1 = input.nextBigInteger();
      System.out.println("Using nextBigInteger(): " + value1);

      System.out.print("Enter a big decimal: ");

      // reads the big decimal
      BigDecimal value2 = input.nextBigDecimal();
      System.out.println("Using nextBigDecimal(): " + value2);

      input.close();
   }
} 
```

**输出**：

```java
Enter a big integer: 987654321
Using nextBigInteger(): 987654321
Enter a big decimal: 9.55555
Using nextBigDecimal(): 9.55555 
```

在上面的示例中，我们使用`java.math.BigInteger`和`java.math.BigDecimal`包分别读取`BigInteger`和`BigDecimal`。

* * *

## Java 扫描器的工作原理

`Scanner`类读取整行并将该行分为令牌。 令牌是对 Java 编译器有意义的小元素。 例如，

假设有一个输入字符串：

```java
He is 22 
```

在这种情况下，扫描器对象将读取整行并将字符串分成标记：`He`，`is`，`22 `。 然后，对象遍历每个令牌，并使用其不同方法读取每个令牌。

**注意**：默认情况下，空格用于划分令牌。