如何实现从TXT文件读取并返回对象的Java方法?
优化方案与实现
1. 抽象类合理性确认
你用抽象类提取设备公共属性的做法完全正确,符合面向对象的继承与封装思想,能有效减少代码冗余,后续新增设备子类时可直接复用公共逻辑。
2. 文件读取逻辑优化
原代码仅初始化了Scanner,无实际读取逻辑。根据TXT格式,每个设备占6行(类型+5个属性),可按设备块读取,步骤如下:
- 循环读取设备类型
- 读取公共属性(id、locker、year)
- 根据类型读取子类特有属性,创建对应对象
- 使用try-with-resources自动关闭Scanner,避免资源泄漏
优化后的代码:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Program { public List<Equipment> readFromFile() throws FileNotFoundException { List<Equipment> equipmentList = new ArrayList<>(); File equipmentFile = new File("equipment.txt"); // try-with-resources自动关闭Scanner try (Scanner reader = new Scanner(equipmentFile)) { while (reader.hasNextLine()) { // 读取设备类型 String type = reader.nextLine().trim(); // 读取公共属性 Integer id = Integer.parseInt(reader.nextLine().trim()); String locker = reader.nextLine().trim(); Integer year = Integer.parseInt(reader.nextLine().trim()); // 根据类型创建对应子类对象 switch (type) { case "Saw": String sawType = reader.nextLine().trim(); Boolean needsGrinding = Boolean.parseBoolean(reader.nextLine().trim()); equipmentList.add(new Saw(type, id, locker, year, sawType, needsGrinding)); break; case "Drill": Boolean batteryPowered = Boolean.parseBoolean(reader.nextLine().trim()); Boolean needsNewBit = Boolean.parseBoolean(reader.nextLine().trim()); equipmentList.add(new Drill(type, id, locker, year, batteryPowered, needsNewBit)); break; default: // 处理未知类型,跳过剩余行避免程序崩溃 System.out.println("未知设备类型:" + type); for (int i = 0; i < 5; i++) { if (reader.hasNextLine()) reader.nextLine(); } break; } } } return equipmentList; } }
3. 类结构优化建议
- 给Equipment添加getter方法,方便外部访问属性
- 子类添加toString方法,便于调试打印对象信息
- 可考虑移除子类的
equipmentName字段(该值与设备类型重复),若需保留则当前实现可行
修改后的Equipment类:
public abstract class Equipment { private Integer id; private String locker; private Integer year; public Equipment(Integer id, String locker, Integer year) { this.id = id; this.locker = locker; this.year = year; } // 公共属性getter public Integer getId() { return id; } public String getLocker() { return locker; } public Integer getYear() { return year; } // 抽象toString,子类实现 @Override public abstract String toString(); }
修改后的Drill类(添加toString):
public class Drill extends Equipment{ private String equipmentName; private Boolean batteryPowered; private Boolean needsNewBit; public Drill(String equipmentName, Integer id, String locker, Integer year, Boolean batteryPowered, Boolean needsNewBit) { super(id, locker, year); this.equipmentName = equipmentName; this.batteryPowered = batteryPowered; this.needsNewBit = needsNewBit; } @Override public String toString() { return "Drill{" + "equipmentName='" + equipmentName + '\'' + ", batteryPowered=" + batteryPowered + ", needsNewBit=" + needsNewBit + ", id=" + getId() + ", locker='" + getLocker() + '\'' + ", year=" + getYear() + '}'; } }
修改后的Saw类(添加toString):
public class Saw extends Equipment{ private String equipmentName; private String sawType; private Boolean needsGrinding; public Saw(String equipmentName, Integer id, String locker, Integer year, String sawType, Boolean needsGrinding) { super(id, locker, year); this.equipmentName = equipmentName; this.sawType = sawType; this.needsGrinding = needsGrinding; } @Override public String toString() { return "Saw{" + "equipmentName='" + equipmentName + '\'' + ", sawType='" + sawType + '\'' + ", needsGrinding=" + needsGrinding + ", id=" + getId() + ", locker='" + getLocker() + '\'' + ", year=" + getYear() + '}'; } }
内容的提问来源于stack exchange,提问作者Jonathan S.
相关产品推荐
相关产品推荐

