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

如何实现从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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:24:47