
本文介绍如何使用java读取文本文件时跳过首行,并从每行中提取球员的姓名和位置信息,涵盖传统scanner与现代stream两种实现方式,并强调资源管理与字符串分割技巧。
本文介绍如何使用java读取文本文件时跳过首行,并从每行中提取球员的姓名和位置信息,涵盖传统scanner与现代stream两种实现方式,并强调资源管理与字符串分割技巧。
在处理结构化文本文件(如球队名单)时,常需跳过标题行,并从带分隔符的行中提取关键字段。以 WesternBulldogs.txt 为例,其首行为球队名称,第二行为教练信息(无编号),后续每行为“编号, 姓名, 位置”格式(部分含队长标记 c)。目标是:跳过首行;对教练行直接输出;对球员行跳过编号,提取姓名和位置。
✅ 推荐方案:使用 Files.lines() + Stream API(简洁安全)
Java 8+ 的 Stream<String> 配合 try-with-resources 自动关闭资源,代码更健壮、可读性更强:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class AFLTeamMember {
public static void main(String[] args) throws IOException {
Path path = Paths.get("WesternBulldogs.txt");
try (var lines = Files.lines(path)) {
lines.skip(1) // 跳过首行("Western Bulldogs")
.map(line -> line.split(", ", 2)) // 最多切2段:[编号+逗号, 剩余内容] 或 [姓名, 位置]
.forEach(parts -> {
if (parts.length >= 2) {
// 统一输出 "姓名, 位置" —— 对教练行(无编号)和球员行均适用
System.out.println(parts[parts.length - 2].trim() + ", " +
parts[parts.length - 1].trim());
}
});
}
}
}? 关键点:split(", ", 2) 限制分割次数为2,确保即使位置字段含逗号(如 "FOL, c")也不会被错误切分;parts[parts.length-2] 和 parts[parts.length-1] 安全获取倒数两段,兼容教练行("Luke Beveridge, COACH" → 两段)和球员行("10, Easton Wood, FB" → ["10", "Easton Wood, FB"],再对第二段二次拆分亦可,但本例直接取末两段更鲁棒)。
Java Maven Common下载Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
⚙️ 备选方案:传统 Scanner(需手动控制流)
若需逐行处理或兼容旧版本,可结合 hasNextLine() 与条件判断:
立即学习“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();
lineNumber++;
if (lineNumber == 1) continue; // 跳过首行
if (lineNumber == 2) {
System.out.println(line); // 教练行原样输出
continue;
}
// 球员行:按第一个逗号分割,跳过编号
String[] segments = line.split(",", 2); // ["10", " Easton Wood, FB"]
if (segments.length == 2) {
String nameAndPos = segments[1].trim();
// 进一步分离姓名与位置(处理 "FOL, c" 等情况)
String[] namePos = nameAndPos.split(",", 2);
System.out.println(namePos[0].trim() + ", " +
(namePos.length > 1 ? namePos[1].trim() : ""));
}
}
}
}
}⚠️ 注意事项与最佳实践
- 资源必须关闭:无论用 Scanner 还是 Files.lines(),务必使用 try-with-resources,避免文件句柄泄漏。
- 空行与异常处理:生产代码应检查 line 是否为空、split 结果长度是否合规,并捕获 IOException。
- 编码问题:Windows 默认 ANSI 编码,建议显式指定 UTF-8:Files.lines(path, StandardCharsets.UTF_8)。
- 性能考量:小文件推荐 Stream;超大文件需考虑 BufferedReader + 手动缓冲。
通过上述方法,你不仅能精准跳过无关行,还能灵活解析结构化文本——这是Java文件处理的核心技能之一。


















