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

Java读取并验证TXT文件中多行学生数据的实现方案

学生TXT数据的验证与导出实现方案

1. 重构读取逻辑:按3行块遍历所有学生

你的现有代码仅读取前3行,要实现完整的学生数据处理,需要循环读取每3行作为一组学生数据,同时处理文件末尾可能的不完整数据。这里用try-with-resources自动管理流资源,避免手动关闭的遗漏:

String fileName = "\\Users\\under\\Documents\\NetBeansProjects\\CA-Jan24\\students.txt";
String outputFileName = "\\Users\\under\\Documents\\NetBeansProjects\\CA-Jan24\\valid_students.txt";

try (BufferedReader br = new BufferedReader(new FileReader(fileName));
     BufferedWriter bw = new BufferedWriter(new FileWriter(outputFileName))) {
    
    String nameLine, ageLine, studentNoLine;
    // 循环读取每3行一组的学生数据
    while ((nameLine = br.readLine()) != null) {
        ageLine = br.readLine();
        studentNoLine = br.readLine();
        
        // 处理文件末尾的不完整数据(不足3行的情况)
        if (ageLine == null || studentNoLine == null) {
            System.err.println("发现不完整的学生数据,已跳过");
            break;
        }
        
        // 验证通过则写入目标文件
        if (validateStudent(nameLine, ageLine, studentNoLine)) {
            bw.write(nameLine);
            bw.newLine();
            bw.write(ageLine);
            bw.newLine();
            bw.write(studentNoLine);
            bw.newLine();
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

2. 实现数据验证逻辑

根据你给出的规则,编写验证方法,分别校验姓名、年龄、学号的合法性:

private static boolean validateStudent(String nameLine, String ageLine, String studentNoLine) {
    // 验证姓名:假设格式为「名 姓」,名仅含字母,姓可含字母/数字
    String[] nameParts = nameLine.trim().split("\\s+");
    if (nameParts.length != 2) {
        System.err.println("姓名格式错误:" + nameLine);
        return false;
    }
    String firstName = nameParts[0];
    String lastName = nameParts[1];
    if (!firstName.matches("[a-zA-Z]+")) {
        System.err.println("名字仅允许字母:" + firstName);
        return false;
    }
    if (!lastName.matches("[a-zA-Z0-9]+")) {
        System.err.println("姓氏仅允许字母/数字:" + lastName);
        return false;
    }
    
    // 验证年龄:纯数字且在合理范围(6-100岁)
    if (!ageLine.matches("\\d+")) {
        System.err.println("年龄必须是纯数字:" + ageLine);
        return false;
    }
    int age = Integer.parseInt(ageLine);
    if (age < 6 || age > 100) {
        System.err.println("年龄不在合理范围:" + age);
        return false;
    }
    
    // 验证学号:字母数字混合+固定长度(示例设为10位,可按需修改)
    int requiredStudentNoLength = 10;
    if (studentNoLine.length() != requiredStudentNoLength) {
        System.err.println("学号长度不符合要求(需" + requiredStudentNoLength + "位):" + studentNoLine);
        return false;
    }
    if (!studentNoLine.matches("[a-zA-Z0-9]+")) {
        System.err.println("学号仅允许字母/数字:" + studentNoLine);
        return false;
    }
    
    return true;
}

3. 关键细节说明

  • 正则表达式是验证规则的核心,可根据实际需求调整(比如姓名的分隔符、学号的固定长度)
  • 验证不通过的记录会输出错误信息,方便排查问题
  • try-with-resources语法会自动关闭BufferedReader和BufferedWriter,无需手动调用close()

内容的提问来源于stack exchange,提问作者Carl Kellegher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:12:44