Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
类型 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
会调用 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
示例读取 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.out
是 PrintStream
对象,并且该类不提供覆盖默认语言环境的方法。我们可以覆盖整个程序的语言环境 或者我们可以使用格式化,如下一主题 Formatting 中所述。