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

标签 java save fileinputstream fileoutputstream

我正在编写一个小程序来帮助规划 future 的锻炼。我快完成了,但是保存和加载给我带来了一些麻烦。该程序使用一系列“ride”(自定义类)对象,这些对象具有多种特性(例如 Dat,然后是一些整数和 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.
        }
    }

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

最佳答案

不要使用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() 来检查所有数据是否已读取。

关于java - 在 Java 程序中保存和加载自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448860/

相关文章:

java - 在 Spring MVC 中处理 jsp 页面中的表单提交

java - 为什么使用 BufferedInputStream 逐字节读取文件比使用 FileInputStream 快?

jqgrid - 我正在使用 jqGrid 并希望在调整列宽后保存列宽

java - 如何对使用 Scanner 和 InputStream 的方法进行单元测试?

java - 为什么 FileInputStream read() 方法错误地读取问号(ascii : 63) when put into infinite loop?

java - 为什么 ByteBuffer 不提供读写 boolean 数据类型的方法

java - Retrofit 2/Rxjava - 从响应中检索 header

java - C std::string 作为带有 SWIG 的 Java 中的输出参数

javascript - 如何在保存模式下打开向导操作也隐藏编辑、创建、保存和丢弃按钮 Odoo 11

java - 将 Activity 的状态保存到名称/或文件