You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:05:25