save—在java程序中保存和加载自定义对象

fzsnzjdm  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(460)

我正在写一个小程序来帮助计划未来的锻炼。我几乎完成,但保存和加载是给我一些麻烦。这个程序使用一系列的“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文件,并在每次执行程序时进行编辑。然而,该程序从不恢复以前会话中的数据。如果需要更多信息,请告诉我。提前感谢您的帮助!

jq6vz3qz

jq6vz3qz1#

不要使用 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 这样,检查是否所有的数据都是用 Object readObject() 可能有用。

6ojccjat

6ojccjat2#

不要使用 available() 作为条件。它只是告诉您是否有一些字节可以立即读取而没有任何延迟,这并不意味着流已经到达了它的终点。
另外,您应该在对象流和文件流之间添加一个bufferedinputstream和bufferedoutputstream,这几乎总是一个好主意。
为了解决你的问题,你可以。g。首先在save方法中写入一个整数,告诉您文件中有多少个对象,并在加载时读取该整数,然后用这个值创建一个简单的for循环。
或者你可以扔一个 PushbackInputStream 在行中,然后作为eof检查使用其 read() 方法。它会回来的 -1 在eof上,您可以中止读取。如果它还返回任何东西,你 unread() 读取字节并使用 ObjectInputStream 你放在上面的。

相关问题