Как я могу сериализовать другой объект в существующий файл? - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел бы иметь возможность позволить пользователю создавать объект, вводя его информацию и нажимая кнопку, без предварительного создания экземпляра объекта в коде.

Я использую сериализацию для сохранения объекта с данными, введенными пользователем в би-файл, но каждый раз, когда я пытаюсь сохранить новый объект, он перезаписывает его

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");
}

Я запускаю этот метод всякий раз, когда пользователь нажимает кнопку «Добавить». Это работает для одного объекта перемещения, когда я хочу сохранить более одного, он перезаписывает его.

Вот код, который я написал для чтения объекта в 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 голосов
/ 03 апреля 2019

Используйте один ObjectOutputStream для записи нескольких объектов в один файл, если вы собираетесь читать их с помощью одного ObjectInputStream.

Сериализованный файл состоит не только из последовательностисериализованные объекты.Каждый ObjectOutputStream записывает заголовок сериализации в поток перед любой записанной вами последовательностью объектов или примитивов.Использование режима добавления с несколькими FileOutputStreams вам не поможет.

Можно использовать несколько ObjectOutputStream для одного файла, если вы также используете несколько ObjectInputStream.В этом случае вам также может понадобиться найти определенную позицию в файле.

Кстати, Java предоставляет удобный механизм, обеспечивающий закрытие потока - даже если возникает исключение.Блок try-with-resources также требует меньше кода.

try ( ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename))) {
    os.writeObject(movie1);
}
0 голосов
/ 03 апреля 2019

Один из конструкторов FileOutputStream имеет параметр 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();
    }
...