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
相关产品推荐
相关产品推荐

