我有一个名为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();
}
派生类怎么办?
答案 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());
}
}
}