我正在编写一个小程序来帮助规划 future 的锻炼。我快完成了,但是保存和加载给我带来了一些麻烦。该程序使用一系列“ride”(自定义类)对象,这些对象具有多种特性(例如 Dat,然后是一些整数和 double )
现在,我有两种方法,“saver”和“loader”:
public void saver() {
try{ // Catch errors in I/O if necessary.
// Open a file to write to, named SavedObj.sav.
FileOutputStream saveFile=new FileOutputStream("SaveObj.sav");
// Create an ObjectOutputStream to put objects into save file.
ObjectOutputStream save = new ObjectOutputStream(saveFile);
// Now we do the save.
for (int x = 0; x < rides.size(); x++) {
save.writeObject(rides.get(x).getDate());
save.writeObject(rides.get(x).getMinutes());
save.writeObject(0);
save.writeObject(rides.get(x).getIF());
save.writeObject(rides.get(x).getTss());
}
// Close the file.
save.close(); // This also closes saveFile.
}
catch(Exception exc){
exc.printStackTrace(); // If there was an error, print the info.
}
}
public void loader() {
try{
// Open file to read from, named SavedObj.sav.
FileInputStream saveFile = new FileInputStream("SaveObj.sav");
// Create an ObjectInputStream to get objects from save file.
ObjectInputStream save = new ObjectInputStream(saveFile);
Ride worker;
while(save.available() > 0) {
worker = new Ride((Date)save.readObject(), (int)save.readObject(), (double)save.readObject(), (double)save.readObject(), (int)save.readObject());
addRide(worker.getDate(), worker.getMinutes(), 0, worker.getIF(), worker.getTss());
}
// Close the file.
save.close(); // This also closes saveFile.
}
catch(Exception exc){
exc.printStackTrace(); // If there was an error, print the info.
}
}
当我运行程序时,“保存”和“加载”都没有返回任何错误。当 .sav 文件不存在时,会创建一个 .sav 文件,并在每次执行程序时对其进行编辑。然而,该程序永远不会恢复以前 session 的数据。如果需要更多信息,请告诉我。 预先感谢您的帮助!
最佳答案
不要使用available()
,它返回可以无阻塞读取的字节数。它并不意味着读取了所有字节。
如果您的对象永远不会null
,您可以使用Object readObject()
来检查是否所有数据都从输入流中读取。
Date date = null;
while( (date = (Date)save.readObject()) != null) {
worker = new Ride(date, (int)save.readObject(), (double)save.readObject(), (double)save.readObject(), (int)save.readObject());
addRide(worker.getDate(), worker.getMinutes(), 0, worker.getIF(), worker.getTss());
}
否则,如果读取的值可能为 null,您可以直接序列化 Ride
对象或包含要序列化的所有字段的类,而不是可能为 null
这样,就可以通过 Object readObject()
来检查所有数据是否已读取。
关于java - 在 Java 程序中保存和加载自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448860/