如何在Java中读取自定义TXT文件并关联学生与班级
如何在Java中读取自定义格式文本文件并按班级存储学生数据
我需要读取一种自定义格式的文本文件,文件结构如下:
Classroom1 Student1 Name, Student1 Surname , Student1 Age Student2 Name, Student2 Surname , Student2 Age Student3 Name, Student3 Surname , Student3 Age ... Classroom2 Student1 Name, Student1 Surname , Student1 Age Student2 Name, Student2 Surname , Student2 Age ...
目标是将每个班级的学生分别存入对应的集合,计划使用Map<String, List<Student>>结构,但不知道如何实现读取逻辑。以下是我写的未完成代码片段:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // detect inputs from the terminal input, System.in List<Student> students; while(in.hasNextLine()) { // while the scanner has a next line in.nextLine(); String[] s = in.nextLine().split(","); students.add(new Student(s[0], s[1], s[2])); } } public class Student { public String name; public String surname; public int age; public Student(String name, String surname, int age) { // ... } } }
解决方案
1. 修正基础问题
- 内部类
Student需要声明为static,否则无法在静态的main方法中实例化 - 完善
Student构造方法,完成属性赋值 - 将读取源从控制台
System.in改为目标文本文件
2. 核心读取逻辑
- 用
Map<String, List<Student>>存储班级与学生列表的映射 - 遍历文件每一行,判断当前行是班级名还是学生数据:
- 若为班级名,创建新的学生列表并放入Map,记录当前班级
- 若为学生数据,分割字符串并处理空格,转换年龄为整数,创建
Student对象加入当前班级的列表
完整代码示例
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { // 替换为你的文件路径 String filePath = "students.txt"; Map<String, List<Student>> classroomMap = new HashMap<>(); String currentClassroom = null; try (Scanner scanner = new Scanner(new File(filePath))) { while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); // 跳过空行 if (line.isEmpty()) { continue; } // 判断是否是班级行(不含逗号) if (!line.contains(",")) { currentClassroom = line; // 初始化该班级的学生列表 classroomMap.put(currentClassroom, new ArrayList<>()); } else { // 处理学生数据行 if (currentClassroom == null) { // 异常情况:学生行出现在班级行之前 System.err.println("无效的文件格式:学生数据无对应班级"); continue; } String[] parts = line.split(","); if (parts.length != 3) { System.err.println("无效的学生数据行:" + line); continue; } // 去除每个字段的首尾空格 String name = parts[0].trim(); String surname = parts[1].trim(); int age; try { age = Integer.parseInt(parts[2].trim()); } catch (NumberFormatException e) { System.err.println("年龄格式错误:" + parts[2].trim()); continue; } // 添加学生到当前班级的列表 classroomMap.get(currentClassroom).add(new Student(name, surname, age)); } } } catch (FileNotFoundException e) { System.err.println("未找到文件:" + filePath); e.printStackTrace(); } // 测试输出结果 for (Map.Entry<String, List<Student>> entry : classroomMap.entrySet()) { System.out.println("班级:" + entry.getKey()); for (Student student : entry.getValue()) { System.out.printf(" 姓名:%s %s,年龄:%d%n", student.name, student.surname, student.age); } } } // 改为静态内部类,方便main方法调用 public static class Student { public String name; public String surname; public int age; public Student(String name, String surname, int age) { this.name = name; this.surname = surname; this.age = age; } } }
关键说明
- 使用
try-with-resources自动关闭Scanner,避免资源泄漏 - 处理了空行、格式错误的学生数据、年龄转换失败等异常情况
- 分割学生数据后去除了字段首尾的空格,适配文件中可能存在的多余空格
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

