Добавление в сериализацию

До сих пор я обнаружил, что есть способ добавить сериализацию, создав подкласс, но это кажется долгим путем. Есть ли лучший способ добавить в сериализацию?

У меня есть этот векторный список в классе с именем Course

private Vector<Student> StudentList = new Vector<>();

У меня есть 2 объекта, конечно. 3 студента зачислены на 1 курс и 2 студента зачислены на другой. Теперь я вызываю этот метод, который выполняет сериализацию в файле, но когда я вызываю его с моим вторым объектом курса, он заменяет предыдущее содержимое.

public void Serialization() {
        try {
            File file = new File("EnrolledStudentsSerial.txt");
            if (!file.exists()){
               file.createNewFile();
            }
            FileOutputStream fo = new FileOutputStream(file);
            ObjectOutputStream output = new ObjectOutputStream(fo);
            output.writeObject("Course: " + this.name + "\n\nEnrolled Students: ");
            for (int i = 0; i < StudentList.size(); i++) {
                Student p_obj = StudentList.elementAt(i);
                String content = "\n\tStudent Name: " + p_obj.getName() + "\n\tStudent Department: " + p_obj.getDepartment() + "\n\tStudent Age: " + p_obj.getAge() + "\n";
                output.writeObject(content);
            }
            output.writeObject("\n");
            fo.close();
        } catch (IOException ioe){
            System.out.println("Error: " + ioe.getMessage()); 
        }
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
382
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите добавить в файл, вместо замены содержимого вам нужно сообщить об этом FileOutputStream , добавив дополнительный аргумент и вызвать FileOutputStream(File file, boolean append). К вашему сведению: не делайте этого с ObjectOutputStream.

Вам не нужно вызывать createNewFile(), так как FileOutputStream сделает это независимо от того, добавляется оно или нет.

Однако на самом деле вы не сериализуете свои объекты, поскольку вместо этого вы сериализуете строки. То, что ты делаешь, не имеет смысла. Поскольку вы, кажется, хотите, чтобы результатом был текстовый файл (вы пишете текст, а файл — это имена .txt), вы должны забыть о ObjectOutputStream и вместо этого использовать FileWriter.

Еще лучше, вместо использования старого API файлового ввода-вывода, вы должны использовать «более новый» API NIO.2, который был добавлен в Java 7. Вы также должны использовать попытку с ресурсами. То же самое касается древнего класса Vector , который был заменен на ArrayList в Java 1.2.

Соглашение об именах Java заключается в том, что имена полей и методов должны начинаться со строчной буквы. И поскольку ваш метод больше не "сериализуется", вы должны дать ему лучшее имя.

Применяя все это, ваш код должен быть:

import static java.nio.file.StandardOpenOption.APPEND;
import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.WRITE;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
private ArrayList<Student> studentList = new ArrayList<>();
public void writeToFile() {
    Path file = Paths.get("EnrolledStudentsSerial.txt");
    try (BufferedWriter output = Files.newBufferedWriter(file, CREATE, APPEND, WRITE)) {
        output.write("Course: " + this.name + "\n\nEnrolled Students: ");
        for (Student student : studentList) {
            String content = "\n\tStudent Name: " + student.getName() +
                             "\n\tStudent Department: " + student.getDepartment() +
                             "\n\tStudent Age: " + student.getAge() + "\n";
            output.write(content);
        }
        output.write("\n");
    } catch (IOException ioe){
        System.out.println("Error: " + ioe.getMessage()); 
    }
}

На самом деле я новичок в Java, и я делаю это для своего задания в колледже, поэтому я понял, как добавить в файл, но этот код будет писать обычный текст, верно? Итак, как мне его сериализовать?

user13933479 19.12.2020 07:07

@HarisMusa Почему вы хотите выполнять сериализацию Java для текста? Это не имеет никакого смысла.

Andreas 19.12.2020 07:11

Итак, я работал над своими концепциями, и теперь я понимаю, что объекты должны быть сериализованы, но у меня все еще есть 2 вопроса. 1. Как я могу добавить 2 объекта в один и тот же файл, например сериализовать 1 объект, а затем другой. 2. В чем преимущество сериализации, например, я только что попытался сериализовать объект, а затем десериализовать его, но что я могу сделать с ним после сериализации? польза и использование?

user13933479 19.12.2020 09:47

@HarisMusa 1) Вы не должны добавлять в файл сериализации Java. 2) Вы спрашиваете с целью сериализации? Пожалуйста, проведите небольшое исследование, посмотрев в Интернете. На этот вопрос есть много ответов.

Andreas 19.12.2020 10:36

Другие вопросы по теме