
本文介绍如何使用 java 读取文本文件时跳过标题行,并从每行中提取姓名和位置(跳过编号),涵盖传统 scanner 和现代 stream 两种方式,并强调资源安全关闭与字符串分割技巧。
本文介绍如何使用 java 读取文本文件时跳过标题行,并从每行中提取姓名和位置(跳过编号),涵盖传统 scanner 和现代 stream 两种方式,并强调资源安全关闭与字符串分割技巧。
在处理结构化文本文件(如球队名单)时,常需跳过无关的头部信息(如队名),并从带编号的记录行中精准提取关键字段(如姓名、位置)。原始代码仅读取前三行,无法遍历全部数据,且未处理编号剥离与资源释放问题。以下提供两种健壮、可扩展的解决方案。
✅ 推荐方案:使用 Files.lines() + Stream API(更简洁、函数式)
Java 8 引入的 Stream<String> 非常适合此类逐行处理任务。配合 skip(1) 可轻松跳过首行;再用 split(", ") 拆分字段,即可按索引提取所需内容:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class AFLTeamMember {
public static void main(String[] args) throws IOException {
Path path = Paths.get("WesternBulldogs.txt");
try (Stream<String> lines = Files.lines(path)) {
lines.skip(1) // 跳过首行 "Western Bulldogs"
.map(line -> line.split(", ", 2)) // 最多分割为 2 部分:[编号, 姓名+位置] 或 [姓名, 位置]
.forEach(parts -> {
if (parts.length >= 2) {
// 若含编号(如 "10, Easton Wood, FB"),取 parts[1];否则直接拼接
String data = parts[0].contains(",") ? parts[0] : parts[1];
System.out.println(data);
}
});
}
}
}⚠️ 注意:split(", ", 2) 的第二个参数 2 表示最多分割成 2 个部分,确保即使位置字段含逗号(如 "FOL, c")也不会被错误切分。
✅ 兼容方案:使用 Scanner + 显式循环(更易调试、兼容旧版本)
若需保留 Scanner 或需逐行控制逻辑,应使用 try-with-resources 自动关闭资源,并通过计数器跳过首行:
立即学习“Java免费学习笔记(深入)”;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class AFLTeamMember {
public static void main(String[] args) throws IOException {
File file = new File("WesternBulldogs.txt");
try (Scanner scanner = new Scanner(file)) {
int lineNumber = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine().trim();
if (lineNumber == 0) {
// 跳过第 1 行(队名)
lineNumber++;
continue;
}
// 对其余行:按 ", " 分割,跳过编号字段
String[] fields = line.split(", ", 2); // 限制分割次数,防位置内逗号干扰
if (fields.length > 1) {
System.out.println(fields[1]); // 输出 "Easton Wood, FB" 等
} else if (fields.length == 1 && line.contains(",")) {
// 处理极简格式(如无编号的教练行),仍按逗号分割
String[] fallback = line.split(",", 2);
System.out.println(fallback[0].trim() + ", " + fallback[1].trim());
}
}
}
}
}? 关键要点总结
- 务必关闭资源:始终使用 try-with-resources(Scanner 或 Stream),避免文件句柄泄漏;
- 跳过首行:lines.skip(1)(Stream)或手动 lineNumber++ 计数(Scanner);
- 安全分割字段:用 split(", ", 2) 限定分割次数,防止位置中的 , c 导致数组越界;
- 空行/异常处理:生产环境建议添加 if (!line.isEmpty()) 和 try-catch 包裹 split 操作;
- 编码兼容性:若文件含中文或特殊字符,推荐显式指定编码:Files.lines(path, StandardCharsets.UTF_8)。
通过以上任一方式,你都能可靠地跳过标题行、剥离球员编号,并稳定提取「姓名, 位置」结构化信息,为后续分析或展示奠定基础。


















