将多个条目序列化到同一个文件

时间:2016-11-22 19:11:47

标签: java serialization

我基本上创建了一个日记应用,每个日记条目都需要保留,我希望将所有条目保存在一个文件中。

我已经看过很多关于序列化单个对象的教程,所以我提出了这个解决方案,(它不起作用)但即使我设法修复它,这感觉就像一个草率的解决方案。

(这里我试图序列化一个arraylist,每次我保存一个条目,我都会对列表进行反序列化,并在再次序列化之前将新条目添加到列表中)

为了澄清,我的问题是:这是多次将对象保存到同一文件的好方法吗?

或者是否有人有关于我应该尝试的其他内容的一些提示,也欢迎关于此的视频或文档的链接。

public class Serializer 
{   

    //Calls readFile and adds the returned entries to an ArrayList
    //Add the target object to the list and write to the file
    public static void writeToFile(Object target)
    {   
        ArrayList entries = new ArrayList();

        entries = readFile();
        entries.add(target);


        String filename = "entries.bin";

        FileOutputStream fileOut = null;
        ObjectOutputStream objOut = null;

        try 
        {
            fileOut = new FileOutputStream(filename);
            objOut = new ObjectOutputStream(fileOut);
            objOut.writeObject(entries);
            objOut.close();
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }

    //Reads the file and returns all entries in a list
    public static ArrayList readFile () 
    {
        ArrayList persistedEntries = new ArrayList<>();
        String filename = "entries.bin"; 

        FileInputStream fileIn = null;
        ObjectInputStream objIn= null;
        try
        {
            fileIn = new FileInputStream(filename);
            objIn = new ObjectInputStream(fileIn);
            persistedEntries = (ArrayList) objIn.readObject();
            objIn.close();
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
        catch(ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }

        return persistedEntries;
    }   
}

1 个答案:

答案 0 :(得分:0)

  

这是多次将对象保存到同一文件的好方法吗?

我会争辩不。这是因为您的方法writeToFile或更准确appendToFile会在边缘情况下引入奇怪的行为(例如entries.bin具有意外对象)。我会争辩这个:

使用writeToFile(ArrayList<Object> target)覆盖指定数组的文件。然后添加一个方法appendToFile(Object target),用于处理从磁盘读取entries.bin的过程,附加target,然后将数组写入磁盘。这样做的好处是可以将与新对象target“合并”的任何逻辑与磁盘上的文件以及写入entries.bin文件的实际逻辑分开。

如果只是一次学习练习,我会选择以上内容。潜在resource

添加重新格式化的版本:

public class Serializer 
{   
    private String filename;

    // pass in "entries.bin"
    public Serializer(String filename) {
        this.filename = filename;
    }

    public void append(Object target) {
        // readfile will return at least empty arraylist
        ArrayList entries = readFile();
        entries.add(target);
        serialize(entries);
    }

    public void serialize(ArrayList entries)
    {   
        FileOutputStream fileOut = null;
        ObjectOutputStream objOut = null;
        try 
        {
            fileOut = new FileOutputStream(filename);
            objOut = new ObjectOutputStream(fileOut);
            objOut.writeObject(entries);
            objOut.close();
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }

    //Reads the file and returns all entries in a list
    public ArrayList deserialize () 
    {
        ArrayList persistedEntries = new ArrayList<>();

        FileInputStream fileIn = null;
        ObjectInputStream objIn = null;
        try
        {
            fileIn = new FileInputStream(filename);
            objIn = new ObjectInputStream(fileIn);

            Object result = objIn.readObject();
            if (!(result instanceof ArrayList)) {
                // read object is not an arraylist
            }

            persistedEntries = (ArrayList) objIn.readObject();
            objIn.close();
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
        catch(ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }

        return persistedEntries;
    }   
}