在Java程序中保存和加载自定义对象

在Java程序中保存和加载自定义对象,java,save,fileinputstream,fileoutputstream,Java,Save,Fileinputstream,Fileoutputstream,我正在写一个小程序来帮助规划未来的训练。我快完成了,但是保存和加载给我带来了一些麻烦。该程序使用“ride”(一个自定义类)对象列表,这些对象具有许多特性(如Dat,然后是一些整数和双精度) 现在,我有两种方法,一种是“saver”,另一种是“loader”: public void saver(){ 如有必要,请尝试{//捕获I/O中的错误。 //打开一个名为SavedObj.sav的文件进行写入。 FileOutputStream saveFile=新的FileOutputStream(“S

我正在写一个小程序来帮助规划未来的训练。我快完成了,但是保存和加载给我带来了一些麻烦。该程序使用“ride”(一个自定义类)对象列表,这些对象具有许多特性(如Dat,然后是一些整数和双精度)

现在,我有两种方法,一种是“saver”,另一种是“loader”:

public void saver(){
如有必要,请尝试{//捕获I/O中的错误。
//打开一个名为SavedObj.sav的文件进行写入。
FileOutputStream saveFile=新的FileOutputStream(“SaveObj.sav”);
//创建ObjectOutputStream以将对象放入保存文件。
ObjectOutputStream保存=新的ObjectOutputStream(保存文件);
//现在我们做保存。
对于(int x=0;x0){
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.getss());
}
//关闭文件。
save.close();//这也会关闭saveFile。
}
捕获(异常exc){
exc.printStackTrace();//如果有错误,请打印信息。
}
}
当我运行程序时,“保存”和“加载”都不会返回任何错误。.sav文件在不存在时创建,并在每次执行程序时进行编辑。然而,该程序从不恢复以前会话中的数据。如果需要更多信息,请告诉我。 提前感谢您的帮助

不要使用
available()
作为条件。它只是告诉您是否有一些字节可以立即读取而没有任何延迟,这并不意味着流已经到达它的终点

您还应该在对象流和文件流之间添加BufferedInputStream和BufferedOutputStream,这几乎总是一个好主意

为了解决你的问题,你可以e。G首先在save方法中写入一个整数,告诉您文件中有多少个对象,并在加载时读取该整数,然后使用该数量创建一个简单的for循环

或者您可以在行中插入一个
PushbackInputStream
,然后作为EOF检查使用其
read()
方法。它将在EOF上返回
-1
,您可以中止读取。如果它返回任何其他内容,则
unread()
读取字节并使用放置在顶部的
ObjectInputStream

不要将
available()
用作条件。它只是告诉您是否有一些字节可以立即读取而没有任何延迟,这并不意味着流已经到达它的终点

您还应该在对象流和文件流之间添加BufferedInputStream和BufferedOutputStream,这几乎总是一个好主意

为了解决你的问题,你可以e。G首先在save方法中写入一个整数,告诉您文件中有多少个对象,并在加载时读取该整数,然后使用该数量创建一个简单的for循环

或者您可以在行中插入一个
PushbackInputStream
,然后作为EOF检查使用其
read()
方法。它将在EOF上返回
-1
,您可以中止读取。如果它返回任何其他内容,请
unread()
读取的字节,并使用放置在顶部的
ObjectInputStream

不要使用
available()
,它返回可以在不阻塞的情况下读取的字节数。这并不意味着所有字节都读取了什么

如果对象从不为
null
,则可以使用
Object readObject()
检查是否从inputstream读取了所有数据

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的单一字段。这样,检查是否使用
对象readObject()
读取了所有数据就可以了。

不要使用
可用()
返回无阻塞情况下可读取的字节数。这并不意味着所有字节都读取了什么

如果对象从不为
null
,则可以使用
Object readObject()
检查是否从inputstream读取了所有数据

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

的单一字段。使用此选项,检查是否使用
对象readObject()读取了所有数据
可以工作。

您的.sav文件中有任何内容吗?在(save.available()>0)
{时,在加载程序下面的
中添加一个断点如何?您的代码是否到达了以
worker=
开头的行?如果是,这里发生了什么?保存文件中有“stuff”但是,当我更新程序时,它似乎没有改变。我在lo中添加了system.out.print