【问题标题】:Saving and Loading Custom Objects in Java Program在 Java 程序中保存和加载自定义对象
【发布时间】:2017-05-17 20:39:54
【问题描述】:

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

现在,我有两个方法,一个“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.
        }
    }

当我运行程序时,“保存”和“加载”都不会返回任何错误。 .sav 文件在不存在时创建,并在每次执行程序时进行编辑。然而,该程序永远不会从以前的会话中恢复数据。如果需要更多信息,请告诉我。 提前感谢您的帮助!

【问题讨论】:

  • 你的 .sav 文件有内容吗?
  • while(save.available() &gt; 0){的下面的loader中添加断点怎么样?您的代码是否符合以worker = 开头的行?如果是这样,这里发生了什么?
  • 保存文件中确实有“东西”。但是,当我更新程序时,它似乎没有改变。我在加载器中添加了一个 system.out.print 并且它永远不会输出。

标签: java save fileinputstream fileoutputstream


【解决方案1】:

不要使用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());
}

否则,如果读取的值可能为空,您可以直接序列化 Ride 对象或包含要序列化的所有字段的类,而不是可能是 null 的单一字段
这样,检查是否所有使用Object readObject() 读取的数据可以工作。

【讨论】:

  • 谢谢,解决了!
【解决方案2】:

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

您还应该在 Object 和 File 流之间添加一个 BufferedInputStream 和 BufferedOutputStream,这几乎总是一个好主意。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多