Scanner
类型的对象可用于将格式化的输入分解为标记(tokens),并根据其数据类型转换各个标记。
将输入分为标记
默认情况下,扫描仪(scanner)使用空格分隔标记。(空格字符包括空格,制表符和行终止符。有关完整列表,请参阅文档 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();
}
}
}
}
请注意,在完成scanner对象后,ScanXan
会调用Scanner
的close
方法。即使scanner不是流,您也需要关闭它以表明已完成其潜在流。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”以表示整数值。
我们必须提到语言环境,因为数千个分隔符和十进制符号是特定于语言环境的。因此,如果我们未指定scanner,应使用US
语言环境,则以下示例在所有语言环境中均无法正常工作。通常不必担心,因为您的输入数据通常来自与您使用相同语言环境的源。但是此示例是Java教程的一部分,并在全世界范围内分发。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中所述。