简介
Scanner类被用于输入的格式化中断,并将其移到Tokens中,然后对其单个的Tokens根据其数据类型进行翻译。
从input——Tokens
默认情况下,一个Scanner使用 空格 键去区分Tokens(空格键包括:blanks,tabs,line terminators. 全部的键值,参考文档Character.isWhitespace) Scanning是怎么工作的呢,让我们一起分析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在扫描仪对象完成后调用扫描仪的关闭方法。 即使扫描仪不是流,您仍然需要关闭它,以表明您已完成其底层流。 ScanXan的输出看起来像这样:
In Xanadu did Kubla Khan A stately pleasure-dome ...
要使用不同的Tokens分隔符,请调用useDelimiter(),指定正则表达式。 例如,假设您希望Tokens分隔符为逗号,可选地后跟空格。 你会调用:
s.useDelimiter(",\\s*");
翻译个体Tokens
ScanXan示例将所有输入Tokens视为简单的字符串值。 Scanner还支持所有Java语言的原始类型(char除外)以及BigInteger和BigDecimal的Tokens。 此外,数值可以使用数千个分隔符。 因此,在美国地区,扫描仪正确读取字符串“32,767”表示整数值。 我们必须提及区域设置,因为数千个分隔符和十进制符号是特定于区域设置的。 因此,如果我们没有指定扫描仪应该使用美国语言环境,以下示例将无法在所有语言环境中正常工作。 这是你不必担心的事情,因为您的输入数据通常来自使用相同语言环境的来源。 但这个例子是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对象,该类不提供覆盖默认语言环境的方法。 我们可以覆盖整个程序的区域设置,或者我们只能使用格式化,如下一个主题格式化所述。