Java写入和读取文件的对象数组

时间:2018-06-05 23:14:03

标签: java

我有一个名为echo json_encode($planArray); break ; 的基类:

Train

我有2个类实现抽象类(我不会在代码中包含getter和setter):

public abstract class Train {
    String serialNo;
    float weight;
    final String label;

    public Train(String serialNo, float weight, String label) {
        this.serialNo = serialNo;
        this.weight = weight;
        this.label = label;
    }

    public abstract float getCapacity();
}

PassengerTrain课程:

public class FreightTrain extends Train implements Cloneable {

    private float capacityKg;
    Vector<String> freightVector = new Vector<String>();

    public FreightTrain(String serialNo, float weight, String label) throws Exception{
        super(serialNo, weight, label);
        if (weight < 0)
            throw new Exception();
    }

    @Override
    public float getCapacity() {
        return this.capacityKg;
    }
}

接下来,我有一个数组列表public class PassengerTrain extends Train implements Cloneable { private float seatNo; Vector<String> passengerId = new Vector<String>(); public PassengerTrain(String serialNo, float weight, String label) throws Exception{ super(serialNo, weight, label); if (weight < 0) throw new Exception(); } @Override public float getCapacity() { return this.seatNo; } } ,其中包含ArrayList<Train> arr;PassengerTrain。我想创建方法将项目从FreightTrain写入文件并从文件中读取数据

这是我的尝试:

arr

但我遇到了一个问题:我无法创建一个从文件中读取此数据的函数,并返回带有初始数据的正确ArrayList。

将从单个类派生到文件的2个不同类的数组编写的最佳和最快方法是什么?

如何重建?

谢谢!

请不要将我的问题视为重复。我搜索过类似的问题,我的问题与现有问题不同。

我不知道如何将对象从文件转换回各自的类型。如果我有public void writeObjectInTextFile(ArrayList<Train> array) { Formatter f = null; try { f = new Formatter(file); } catch (FileNotFoundException e) { e.printStackTrace(); } for(Train train: array) { if(train instanceof PassengerTrain) { String label = train.getLabel(); String serialNo = train.getSerialNo(); float capacity = train.getCapacity(); float weight = train.getWeight(); float seatNo = ((PassengerTrain) train).getSeatNo(); String passId = ""; for(String id:((PassengerTrain) train).getPassengerId()) { passId += id; } f.format("%s %f %s %f %f %s", serialNo, weight, label, capacity, seatNo, passId); } else if(train instanceof FreightTrain) { String label = train.getLabel(); String serialNo = train.getSerialNo(); float capacity = train.getCapacity(); float weight = train.getWeight(); float capacityKg = ((FreightTrain) train).getCapacityKg(); String freightVector = ""; for(String freight: ((FreightTrain) train).getFreightVector()) { freightVector += freight; } f.format("%s %f %s %f %f %s", serialNo, weight, label, capacityKg, capacity, freightVector); } } f.close(); } 派生类怎么办?

2 个答案:

答案 0 :(得分:3)

只需让您的课程实现Serializable,您就可以随时将对象写入文件(当然也可以阅读它们)!这也包括对象的数组。

这是上面10000英尺的答案。正确地实现Serializable(以一种不会再回来咬你的方式)是一个有点令人生畏的主题。但是,有很多文献可以教你如何去做以及如何避免常见的陷阱。我推荐Joshua Bloch&#34; Effective Java&#34;为此,亲自;他为这个主题专门写了一两章。

答案 1 :(得分:1)

if(train instanceof PassengerTrain)这很糟糕。你完全抛弃了继承和多态的整个目的。你的代码不应该关心火车的类型。

您应该使用Java的Object序列化功能。在Serializable课程中实施Train并使用ObjectOutputStream撰写并ObjectInputStream阅读对象。

<强>写:

public void writeTrainsToFile(ArrayList<Train> array, String file) {
    FileOutputStream fileOutputStream = new FileOutputStream(file);

    try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)){
        objectOutputStream.writeInt(array.size());
        for(Train train: array) {
            objectOutputStream.writeObject(train);
        }
    }
}

<强>读:

public void readTrainsFromFile(ArrayList<Train> array, String file) {
    FileInputStream fileInputStream = new FileInputStream(file);

    try(ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream)){
        int trainCount = objectInputStream.readInt();
         for (int i = 0; i < trainCount; i++) {
            array.add((Train)objectInputStream.readObject());
        }
    }
}