如何在文件中读取/写入具有链表的对象



我有这些类:"MyClass1", "MyClass2", "MyClass3"one_answers"MyMainClass",

public class MyMainClass implements Serializable {
     private String att1, att2, att3;
     private int att4, att5, att6;
     private LinkedList <MyClass1> myClass1List = new LinkedList<MyClass1>();
     private LinkedList <MyClass2> myClass2List = new LinkedList<MyClass2>();
     private LinkedList <MyClass3> myClass3List = new LinkedList<MyClass3>();
}

我的程序创建"MyMainClass"的寄存器(对象)并将其存入LinkedList中。我想把对象的LinkedList保存在一个文件中,以便在我重新打开程序后得到它们。怎么做呢?我已经尝试过ObjectOutputStream,但不工作。谢谢。

编辑:我的代码添加一个对象(我只是读了一个例子,并尝试):

public static void addObject (MyMainClass p) {
    try {
        outputStream = new ObjectOutputStream(new FileOutputStream("myfile.dat"));
        outputStream.writeObject(p);
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
        System.exit(1);
    } catch (IOException ex) {
        ex.printStackTrace();
        System.exit(1);
    } finally {
        try {
            if (outputStream != null) {
                outputStream.flush();
                outputStream.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.exit(1);
        }
    }
}

注意:"MyClass1", "MyClass2", "MyClass3"是可序列化的。

我将使"myClass1", "myClass2"one_answers"myClass3"可序列化,然后将myClass1List, myClass2ListmyClass3List(以及您想要保存的任何其他数据)包装在另一个可序列化的类中,以便您可以使用序列化/反序列化来保存和恢复所有程序状态。

除非myMainClass是那个包装器,在这种情况下,您需要声明它们都实现了Serializable

myMainClass未标记为Serializable。此外,myClass1, myClass2myClass3也是可序列化的吗?如果没有,他们应该。

另一个注意事项,请遵循Java命名约定;类名以大写字母开头

你确定它没有写入文件,还是代码抛出了你看不到的异常?

在你所有的catch块中,你有System.exit(1),它绝对没有给你任何正在发生的异常的信息;你实际上是在吞下它们。您至少应该打印出stacktrace (ex.printStackTrace()),这样您就可以看到哪里出错了。

我在很久以前的高中项目中使用了follow。由于我的英语水平很差,我真的不明白你想要保存和加载什么类(LinkedList或myMainClass),但我使用这个解决方案成功地存储和加载了我的任何自定义对象。我希望它对你有用。

用法:

myMainClass object;
//
// ... your code fillin up the content of object
//
MyIO io = new MyIO();
io.save("", "myfile.dat", object); // "" as first argument will make java use current working directory
// to load the object:
myMainObject object = (myMainObject) io.load("", "myfile.dat"); 
源:

import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class MyIO {
    // String path - path to the directory where the file is supposed to be saved.
    // String filename - the name of the file
    // Object data - object that you wish to save in the file. In your case "myMainClass"
    public void save(String path, String filename, Object data) {
        try {
            FileOutputStream fos = new FileOutputStream(path + filename, false);
            GZIPOutputStream gzos = new GZIPOutputStream(fos);
            ObjectOutputStream out = new ObjectOutputStream(gzos);
            out.writeObject(data);
            out.flush();
            out.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
    // String path - path to the directory where the file is stored
    // String filename - the name of the file
    // The function returns java object which can be cast to myMainClass.
    public Object load(String path, String filename) {
        try {
            FileInputStream fis = new FileInputStream(path + filename);
            GZIPInputStream gzis = new GZIPInputStream(fis);
            ObjectInputStream in = new ObjectInputStream(gzis);
            Object data = in.readObject();
            in.close();
            return data;
        } catch (Exception e) {
            System.out.println(e);
        }
        return null;
    }
}

相关内容

  • 没有找到相关文章