我正在写一个小程序来帮助计划未来的锻炼。我几乎完成,但保存和加载是给我一些麻烦。这个程序使用一系列的“ride”(一个自定义类)对象,这些对象具有许多特性(比如dat,然后是一些int和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.
}
}
当我运行程序时,“save”和“load”都不会返回任何错误。当一个.sav文件不存在时,就会创建一个.sav文件,并在每次执行程序时进行编辑。然而,该程序从不恢复以前会话中的数据。如果需要更多信息,请告诉我。提前感谢您的帮助!
2条答案
按热度按时间jq6vz3qz1#
不要使用
available()
它返回可以不阻塞地读取的字节数。这并不意味着所有的字节都被读取了。如果你的东西从来没有
null
,你可以用Object readObject()
检查是否从inputstream读取了所有数据。否则,如果读取值可能为null,则可以直接序列化
Ride
对象或包含要序列化的所有字段的类,而不是可以序列化的单一字段null
这样,检查是否所有的数据都是用Object readObject()
可能有用。6ojccjat2#
不要使用
available()
作为条件。它只是告诉您是否有一些字节可以立即读取而没有任何延迟,这并不意味着流已经到达了它的终点。另外,您应该在对象流和文件流之间添加一个bufferedinputstream和bufferedoutputstream,这几乎总是一个好主意。
为了解决你的问题,你可以。g。首先在save方法中写入一个整数,告诉您文件中有多少个对象,并在加载时读取该整数,然后用这个值创建一个简单的for循环。
或者你可以扔一个
PushbackInputStream
在行中,然后作为eof检查使用其read()
方法。它会回来的-1
在eof上,您可以中止读取。如果它还返回任何东西,你unread()
读取字节并使用ObjectInputStream
你放在上面的。