在Java开发中,从文本文件读取数据并解析为实体对象是常见的数据处理场景,比如读取存储学生信息的文本文件,将每一行的数据转换为对应的学生对象,方便后续的业务逻辑处理。

前置准备
首先我们需要准备一个存储学生信息的文本文件,假设文件名为student.txt,内容格式如下,每一行代表一个学生的信息,属性之间用逗号分隔:
1,张三,20,男,计算机科学与技术 2,李四,21,女,软件工程 3,王五,19,男,人工智能
同时需要定义对应的学生类Student,包含id、姓名、年龄、性别、专业五个属性,以及对应的构造方法和getter、setter方法:
public class Student {
private int id;
private String name;
private int age;
private String gender;
private String major;
public Student() {
}
public Student(int id, String name, int age, String gender, String major) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.major = major;
}
// getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public String toString() {
return "Student{id=" + id + ", name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + ", major='" + major + '\'' + '}';
}
}文件读取与数据解析实现
我们使用BufferedReader来读取文本文件,它是Java IO中高效的字符流读取工具,可以逐行读取文件内容,避免频繁操作IO影响性能。
实现步骤
- 创建文件输入流,关联到目标文本文件
- 使用
BufferedReader包装输入流,逐行读取文件内容 - 对每一行非空内容按逗号拆分,得到各个属性值
- 将拆分后的属性值转换为对应类型,传入
Student构造方法创建对象 - 将创建好的对象添加到集合中,最后关闭流释放资源
完整代码示例
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class StudentFileParser {
public static void main(String[] args) {
// 存储解析后的学生对象集合
List<Student> studentList = new ArrayList<>();
// 文本文件路径,根据实际存放位置调整
String filePath = "student.txt";
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(filePath));
String line;
// 逐行读取文件内容
while ((line = reader.readLine()) != null) {
// 跳过空行
if (line.trim().isEmpty()) {
continue;
}
// 按逗号拆分字符串,得到属性数组
String[] parts = line.split(",");
// 校验数据格式,确保拆分后长度符合预期
if (parts.length != 5) {
System.out.println("数据格式异常,跳过该行:" + line);
continue;
}
// 解析各个属性值,转换为对应类型
int id = Integer.parseInt(parts[0].trim());
String name = parts[1].trim();
int age = Integer.parseInt(parts[2].trim());
String gender = parts[3].trim();
String major = parts[4].trim();
// 创建学生对象并添加到集合
Student student = new Student(id, name, age, gender, major);
studentList.add(student);
}
System.out.println("文件解析完成,共解析到" + studentList.size() + "个学生对象:");
// 遍历输出学生对象信息
for (Student student : studentList) {
System.out.println(student);
}
} catch (IOException e) {
System.out.println("文件读取失败:" + e.getMessage());
} catch (NumberFormatException e) {
System.out.println("数据转换失败:" + e.getMessage());
} finally {
// 关闭流,释放资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("流关闭失败:" + e.getMessage());
}
}
}
}
}注意事项
在实际开发中,还需要注意几个问题:首先是文件路径的正确性,如果文件放在项目的resources目录下,可以使用类加载器获取路径,避免硬编码绝对路径;其次是数据格式的兼容性,如果文本中属性分隔符可能变化,可以抽离分隔符为配置项;最后是异常处理,除了IO异常和格式转换异常,还可以根据业务需求增加更多校验逻辑,比如年龄是否为合理值、性别是否符合预期等,保证解析得到的数据有效性。
除了使用BufferedReader,也可以根据文件编码选择InputStreamReader指定编码格式读取,避免中文乱码问题,或者使用Java NIO中的Files类简化读取逻辑,核心的解析思路都是先读取字符串,再按规则拆分转换为对象属性。