如何将另一个对象序列化到现有文件?

时间:2019-04-03 14:21:03

标签: java oop serialization save user-input

我希望能够允许用户通过输入对象的信息并按下按钮来创建对象,而无需先在代码中实例化该对象。

我正在使用序列化将具有用户输入数据的对象保存在bi文件中,但是每次尝试保存新对象时,它都会覆盖它

public void addMovie2() throws IOException {
        MoviesLinkedList.add(new Movies (textField.getText(), ratings.getSelectedItem(), textField_1.getText()));

        Movies movie1 = new Movies(textField.getText(), ratings.getSelectedItem(), textField_1.getText()); 

        String Filename = "MoviesLinkedList.bin";

        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename));
        os.writeObject(movie1);
        os.close();

        System.out.println("Done Saving");
}

每当用户按下“添加”按钮时,我都会运行此方法。这适用于1个移动对象,每当我要保存多个对象时,它都会覆盖它。

这是我编写的用于读取JTextArea中的对象的代码:

 String Filename = "MoviesLinkedList.bin";
          try {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream(Filename));
             Movies movie1 = (Movies) is.readObject();
             MoviesTextArea.setText("Title: " + movie1.title + "    Rating: " + movie1.rating + "    Review: " + movie1.review);
             is.close();
          } catch (IOException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }

            }

2 个答案:

答案 0 :(得分:0)

FileOutputStream constructors中的一个具有参数append。因此,只需使用

ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename, true));

要测试的代码:

public static void main(String[] args) throws IOException {
       f("first");
       f("second");
       f("third");
    }


private static void f(Object o) throws IOException {
        String Filename = "MoviesLinkedList.bin";
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename, true));
        os.writeObject(0);
        os.close();
    }

答案 1 :(得分:0)

如果要使用单个ObjectInputStream读取多个对象,请使用单个ObjectOutputStream 将多个对象写入单个文件。

序列化文件不仅仅包含序列化对象的序列。每个ObjectOutputStream在您写入的对象或基元的任何序列之前都将序列化标头写入流中。将附加模式与多个FileOutputStreams一起使用将无济于事。

如果您还使用多个ObjectInputStream,则可以对单个文件使用多个ObjectOutputStream。在这种情况下,您可能还需要寻找文件中的特定位置。

顺便说一句,Java提供了一种方便的机制来确保关闭流-即使发生异常。 try-with-resources 块也需要更少的代码。

try ( ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename))) {
    os.writeObject(movie1);
}