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

时间:2017-01-03 17:15:14

标签: java save fileinputstream fileoutputstream

我正在编写一个小程序来帮助规划未来的训练。我差不多完成但是保存和装载给我带来了一些麻烦。该程序使用一个“骑”(自定义类)对象列表,这些对象具有许多特性(如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文件。然而,该计划从未恢复以前会议的数据。如果需要更多信息,请告诉我。 在此先感谢您的帮助!

2 个答案:

答案 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()读取所有数据。