Java IO:第四节-Scanner And Formatting
Scanner类型的对象可用于将格式化的输入分解为令牌,并根据其数据类型转换单个令牌。
把输入流中的数据分解,找到对应的数据类型数据。比如在一个文本流中找出所有的数字类型等。
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();
}
}
}
}
文本xanadu.txt的内容:
热烈 庆祝中国成立70周年100!!!
We warmly celebrate the 70th anniversary of the founding of China!!!
输出:
热烈
庆祝中国成立70周年100!!!
We
warmly
celebrate
the
70th
anniversary
of
the
founding
of
China!!!
可以看到,以空格为一个分隔符(令牌)。
请注意,ScanXan在完成扫描程序对象时会调用Scanner的close方法。即使扫描程序不是流,您也需要关闭它以表明已完成其基础流。
当然,你可以使用不同的分隔符来分隔流,调用useDelimiter()方法来实现,传入一个正则表达式。
如:s.useDelimiter(",\\s*"),逗号分隔。
翻译当个分隔值(tokens)
ScanXan示例将所有输入标记视为简单的String值。扫描程序还支持所有Java语言原始类型(char除外)以及BigInteger和BigDecimal的令牌。
此外,数值可以使用数千个分隔符。
因此,在美国语言环境中,扫描程序会正确读取代表整数值的字符串“ 32,767”。
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);
}
以上代码,会把分隔的数字类型读取出来,并累加计算。
Formatter
https://docs.oracle.com/javase/tutorial/essential/io/formatting.html
格式化输出……