参考资料:Java doc、THU 谌卫军老师的教学PPT
Scanner类
作用:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。可以方便地对文本文件中的每一个不同类型的数据单元进行访问;
Scanner 使用分隔符模式将其输入分解为一个个标记(token),默认情况下该分隔符模式与空格(whitespace)匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
构造方法
Scanner(File source) |
Scanner(InputStream source) |
Scanner(String source) 构造一个新的Scanner,它生成的值是从指定字符串扫描的。 |
常用方法
boolean | hasNext() | 此扫描器不执行任何输入 | |
boolean | hasNextLine() | ||
boolean | nextBoolean() | ||
byte | nextByte() | 若文件已结束,则抛出NoSuchElementException;
若类型不一致,则抛出InputMismatchException
| |
double | nextDouble() | ||
int | nextInt() | ||
String | nextLine() | ||
| close() |
读取下一个数据单元的前提是该单元存在,所以在读取数据单元之前,需要先判断其是否存在:
boolean hasNext();
boolean hasNextInt();
boolean hasNextDouble();
boolean hasNextBoolean();
boolean hasNextLine();
例1:访问weather.txt文件,计算所有气温的平均值
import java.io.*; // for File
import java.util.*; // for Scanner
public class TestScanner1 {
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("D:\\weather.txt"));
int num = 0;
double sum = 0;
System.out.print("读入的气温值:");
while (input.hasNext()) {
if (input.hasNextDouble()) {
Double temp = input.nextDouble();
sum += temp;
System.out.print(temp + "\t");
num++;
} else
input.next();
}
input.close();
System.out.println("\nAverage: " + sum / num);
}
}
运行结果:
例2:访问文件hours.txt计算每个人的工作时间
按照以下格式输出:
此题中,一行代表一个人的数据,要求每个人的工作时间需要逐行读取,并对每一行的数据按固定的“ID+姓名+时间”的格式进行分解。
import java.io.*; // for File
import java.util.*; // for Scanner
public class TestScanner2 {
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("D:\\hours.txt"));
while (input.hasNextLine()) {
String line = input.nextLine();
processEmployee(line);
}
}
public static void processEmployee(String line) {
Scanner lineScan = new Scanner(line);
int id = lineScan.nextInt(); // e.g. 456
String name = lineScan.next(); // e.g. "Greg"
double sum = 0.0;
int count = 0;
while (lineScan.hasNextDouble()) {
sum = sum + lineScan.nextDouble();
count++;
}
double average = sum / count;
System.out.println(name + " (ID#" + id + ") worked " +
sum + " hours (" + average + " hours/day)");
}
}