Scanner类型的对象可用于将格式化的输入分解为标记(tokens),并根据其数据类型转换各个标记。

将输入分为标记

默认情况下,扫描仪(scanner)使用空格分隔标记。(空格字符包括空格,制表符和行终止符。有关完整列表,请参阅文档 Character.isWhitespace。)要查看扫描的工作方式,让我们来看一下 ScanXan,该程序可以读取xanadu.txt中的单个单词并打印出来,每行一个。

  1. import java.io.*;
  2. import java.util.Scanner;
  3. public class ScanXan {
  4. public static void main(String[] args) throws IOException {
  5. Scanner s = null;
  6. try {
  7. s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));
  8. while (s.hasNext()) {
  9. System.out.println(s.next());
  10. }
  11. } finally {
  12. if (s != null) {
  13. s.close();
  14. }
  15. }
  16. }
  17. }

请注意,在完成scanner对象后,ScanXan会调用Scannerclose方法。即使scanner不是流,您也需要关闭它以表明已完成其潜在流。
ScanXan输出如下:

  1. In
  2. Xanadu
  3. did
  4. Kubla
  5. Khan
  6. A
  7. stately
  8. pleasure-dome
  9. ...

要使用其他标记分隔符,请调用useDelimiter(),并指定一个正则表达式。例如,假设您希望标记分隔符是逗号,并且可以选择后面跟空格。您会调用,

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

翻译单个标记

ScanXan示例将所有输入标记视为简单String值。Scanner还支持所有Java语言基本类型(char除外),以及BigIntegerBigDecimal的标记。此外,数值可以使用数千个分隔符。因此,在US语言环境中,Scanner正确读取字符串“ 32,767”以表示整数值。
我们必须提到语言环境,因为数千个分隔符和十进制符号是特定于语言环境的。因此,如果我们未指定scanner,应使用US语言环境,则以下示例在所有语言环境中均无法正常工作。通常不必担心,因为您的输入数据通常来自与您使用相同语言环境的源。但是此示例是Java教程的一部分,并在全世界范围内分发。
ScanSum示例读取double值列表并将其加起来。源代码:

  1. import java.io.FileReader;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.util.Scanner;
  5. import java.util.Locale;
  6. public class ScanSum {
  7. public static void main(String[] args) throws IOException {
  8. Scanner s = null;
  9. double sum = 0;
  10. try {
  11. s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt")));
  12. s.useLocale(Locale.US);
  13. while (s.hasNext()) {
  14. if (s.hasNextDouble()) {
  15. sum += s.nextDouble();
  16. } else {
  17. s.next();
  18. }
  19. }
  20. } finally {
  21. s.close();
  22. }
  23. System.out.println(sum);
  24. }
  25. }

这是样本输入文件, usnumbers.txt

  1. 8.5
  2. 32,767
  3. 3.14159
  4. 1,000,000.1

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