# 扫描

> 原文： [https://docs.oracle.com/javase/tutorial/essential/io/scanning.html](https://docs.oracle.com/javase/tutorial/essential/io/scanning.html)

[`Scanner`](https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html) 类型的对象可用于将格式化输入分解为令牌并根据其数据类型转换单个令牌。

## 打破输入到令牌

默认情况下，扫描程序使用空格分隔令牌。 （空格字符包括空格，制表符和行终止符。有关完整列表，请参阅 [`Character.isWhitespace`](https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#isWhitespace-char-) 的文档。）要查看扫描的工作原理，让我们看一下 [`ScanXan`](examples/ScanXan.java) ，一个读取`xanadu.txt`中单个单词并打印出来的程序，每行一个。

```
import java.io.*;
import java.util.Scanner;

public class ScanXan {
    public static void main(String[] args) throws IOException {

        Scanner s = null;

        try {
            s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

            while (s.hasNext()) {
                System.out.println(s.next());
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }
}

```

请注意，`ScanXan`在扫描仪对象完成后调用`Scanner`的`close`方法。即使扫描程序不是流，您也需要将其关闭以指示您已完成其基础流。

`ScanXan`的输出如下所示：

```
In
Xanadu
did
Kubla
Khan
A
stately
pleasure-dome
...

```

要使用其他标记分隔符，请调用`useDelimiter()`，指定正则表达式。例如，假设您希望令牌分隔符为逗号，可选地后跟空格。你会调用，

```
s.useDelimiter(",\\s*");

```

## 翻译单个代币

`ScanXan`示例将所有输入令牌视为简单`String`值。 `Scanner`还支持所有 Java 语言的原始类型（`char`除外）以及`BigInteger`和`BigDecimal`的令牌。此外，数值可以使用数千个分隔符。因此，在`US`语言环境中，`Scanner`正确读取字符串“32,767”表示整数值。

我们必须提到语言环境，因为千位分隔符和小数符号是特定于语言环境的。因此，如果我们未指定扫描程序应使用`US`语言环境，则以下示例将无法在所有语言环境中正常运行。这通常不必担心，因为您的输入数据通常来自使用相同语言环境的源。但是这个例子是 Java Tutorial 的一部分，并且分布在世界各地。

[`ScanSum`](examples/ScanSum.java) 示例读取`double`值列表并将其相加。这是来源：

```
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;

public class ScanSum {
    public static void main(String[] args) throws IOException {

        Scanner s = null;
        double sum = 0;

        try {
            s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt")));
            s.useLocale(Locale.US);

            while (s.hasNext()) {
                if (s.hasNextDouble()) {
                    sum += s.nextDouble();
                } else {
                    s.next();
                }   
            }
        } finally {
            s.close();
        }

        System.out.println(sum);
    }
}

```

这是示例输入文件， [`usnumbers.txt`](examples/usnumbers.txt)

```
8.5
32,767
3.14159
1,000,000.1

```

输出字符串是“1032778.74159”。在某些语言环境中，句点将是不同的字符，因为`System.out`是`PrintStream`对象，并且该类不提供覆盖默认语言环境的方法。我们可以覆盖整个程序的语言环境 - 或者我们可以只使用格式化，如下一主题[格式化](formatting.html)中所述。