
本文介绍如何在 Java 中使用 Scanner 逐行读取文本文件(如 employees.txt),按逗号分隔解析每行数据,并将每条员工记录封装为 Employee record 对象后存入 List,全程符合仅用 Scanner 的约束要求。
本文介绍如何在 java 中使用 scanner 逐行读取文本文件(如 employees.txt),按逗号分隔解析每行数据,并将每条员工记录封装为 `employee` record 对象后存入 `list`,全程符合仅用 scanner 的约束要求。
在 Java 文件处理中,若明确要求仅使用 Scanner(而非 BufferedReader 或 Files.lines() 等现代 API),同时需将结构化文本逐行解析为领域对象,关键在于:每调用一次 nextLine() 获取完整一行 → 立即解析 → 立即构建对象并添加至集合 → 循环直至文件末尾。避免累积字符串(如误用 StringBuilder 拼接所有行),也无需手动处理换行符(System.getProperty("line.separator") 在此场景完全无关)。
首先,定义轻量级不可变员工模型(推荐使用 Java 14+ record):
public record Employee(
String type, // D 或 A(部门/角色标识)
String id, // 员工编号(如 "1")
String name, // 姓名(如 "John Smith")
String dob, // 出生日期(如 "02-12-1971")
String address, // 完整地址(含邮编和州,如 "42 Victoria St. Hurstville NSW 2456")
String empCode, // 工号(如 "10001")
String status // 状态(如 "AVAILABLE"、"ON LEAVE")
) {}⚠️ 注意:原始数据每行字段数不一致(A 类记录无工号
empCode字段),因此实际解析需动态适配。以下示例以 D 类员工(7 字段)为主干逻辑,并给出健壮性处理建议。
核心读取与解析方法如下:
import java.io.File;
import java.util.*;
public List<Employee> loadEmployeesFromFile(File file) {
if (!file.exists()) {
System.err.println("❌ 文件不存在: " + file.getAbsolutePath());
return Collections.emptyList();
}
List<Employee> employees = new ArrayList<>();
try (Scanner scanner = new Scanner(file)) { // 推荐使用 try-with-resources 自动关闭
while (scanner.hasNextLine()) {
String line = scanner.nextLine().trim();
if (line.isEmpty()) continue; // 跳过空行
String[] fields = line.split("\s*,\s*", -1); // 按逗号分割,保留空字段;s* 处理空格
if (fields.length < 6) {
System.err.println("⚠️ 跳过格式异常行: " + line);
continue;
}
String type = fields[0].trim();
String id = fields[1].trim();
String name = fields[2].trim();
String dob = fields[3].trim();
String address = fields[4].trim();
String empCode = (fields.length >= 7) ? fields[5].trim() : ""; // D类第6字段是empCode
String status = (fields.length >= 7) ? fields[6].trim() : fields[5].trim(); // A类第6字段即status
// 根据 type 区分构造逻辑(可选:统一用7字段record,缺失值设为null或占位符)
employees.add(new Employee(type, id, name, dob, address, empCode, status));
}
} catch (Exception e) {
System.err.println("❌ 读取文件时发生错误: " + e.getMessage());
e.printStackTrace();
}
return employees;
}✅ 关键实践要点总结:
-
始终使用
try-with-resources:确保Scanner正确关闭,防止资源泄漏; -
split("\s*,\s*", -1):正则中s*消除逗号前后空格干扰,-1参数保留末尾空字段(应对'BUSY'等带引号值); -
行预处理:
trim()去首尾空格,isEmpty()过滤空行; -
字段校验:检查
fields.length避免ArrayIndexOutOfBoundsException; -
状态兼容性:A 类记录(如
A, 9, John Lucas, ... , SUPPORT)共 6 字段,D 类为 7 字段,需分支处理empCode和status的索引; - 错误处理:对异常行打印警告而非中断整个流程,提升鲁棒性。
调用示例:
File empFile = new File("employees.txt");
List<Employee> list = loadEmployeesFromFile(empFile);
list.forEach(emp ->
System.out.printf("✅ %s | %s | %s | %s%n",
emp.type(), emp.name(), emp.dob(), emp.status())
);该方案严格遵循题设约束(仅用 Scanner),结构清晰、容错性强,可直接集成到业务逻辑中,是处理类似 CSV 风格文本文件的标准范式。

















