文档

Java™ 教程-Java Tutorials 中文版
扫描
Trail: Essential Classes
Lesson: Basic I/O
Section: I/O Streams
Subsection: Scanning and Formatting

扫描

类型 Scanner 的对象可用于将格式化输入分解为语素 (token) 并根据其数据类型转换单个语素。

分解语素

默认情况下,扫描程序使用空白分隔语素。( 空白字符包括空格,制表符和行终止符。有关完整列表,请参阅 Character.isWhitespace 的文档。) 要查看扫描的工作原理,让我们看一下 ScanXan,它读取 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 会调用 Scannerclose 方法。即使扫描程序不是流,你也需要将其关闭以指示你已完成其底层流。

ScanXan 的输出如下所示:

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

要使用其他语素分隔符,请调用 useDelimiter(),指定正则表达式。例如,假设你希望语素分隔符为逗号,可选地后跟空格。你会调用,

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

转换单个语素

ScanXan 示例将所有输入语素视为简单的 String 值。Scanner 还支持所有 Java 语言基本类型的语素 (char 除外 ),以及 BigIntegerBigDecimal。此外,数值可以使用千位分隔符。因此,在 US 语言环境中,Scanner 正确读取字符串“32,767”表示整数值。

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

ScanSum 示例读取 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

8.5
32,767
3.14159
1,000,000.1

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


Previous page: Scanning and Formatting
Next page: Formatting