我正在编写一个小程序来帮助规划未来的训练。我差不多完成但是保存和装载给我带来了一些麻烦。该程序使用一个“骑”(自定义类)对象列表,这些对象具有许多特性(如Dat,然后是一些整数和双精度)
现在,我有两个方法,一个“保护程序”和一个“加载程序”:
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.
}
}
当我运行程序时,“save”和“load”都不会返回任何错误。当一个文件不存在时创建.sav文件,并在每次执行程序时编辑.sav文件。然而,该计划从未恢复以前会议的数据。如果需要更多信息,请告诉我。 在此先感谢您的帮助!
答案 0 :(得分:0)
不要将available()
用作条件。它只是告诉你是否有一些字节可以立即读取而没有任何延迟,这并不意味着流已经到了终点。
你也应该在Object和File流之间添加一个BufferedInputStream和BufferedOutputStream,这几乎总是一个好主意。
要解决您的问题,您可以。 G。首先在save方法中写一个整数,它告诉你文件中有多少个对象,并在加载时读取该整数,然后用这个量做一个简单的for循环。
或者您可以在行中放入PushbackInputStream
,然后在EOF检查中使用其read()
方法。它将在EOF上返回-1
,您可以中止阅读。如果它返回任何其他内容,则unread()
读取的字节并使用您放在顶部的ObjectInputStream
。
答案 1 :(得分:0)
不要使用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()
读取所有数据。