如何使用ObjectOutputStream在字节流中附加对象

问题描述

我想使用ObjectOutputStream在一个二进制文件的末尾附加多个对象
但是当我多次运行以下代码时,我得到了异常

java.io.StreamCorruptedException: invalid type code: AC

问题是
在Java文件的末尾添加APPEND OBJECTS应该有什么头文件吗?

package sourcepackage;

import sourcepackage.persons.Person;
import sourcepackage.persons.Student;

import java.io.*;

public class MainClass {
    public static void main(String[] args) {

        Person mahmoud_kanbar = new Student(21,224466,"Mahmoud Kanbar","ITE");


        try {

            FileOutputStream out = new FileOutputStream("Hello.dat",true);

            ObjectOutputStream objectOut = new ObjectOutputStream(out);

            objectOut.writeObject(mahmoud_kanbar);

            objectOut.close();
            out.close();

            FileInputStream in = new FileInputStream("Hello.dat");

            ObjectInputStream objectIn = new ObjectInputStream(in);


            while (in.available() != 0) {
                Person hi = (Person) objectIn.readobject();
                hi.printInfo();
            }

            objectIn.close();
            in.close();

        } catch (Exception e) {

            System.out.println(e);

        }


    }
}

我一直在寻找有关该问题的解决方法数十年,但找不到任何东西
我想像c ++一样添加对象

解决方法

您可以使用ObjectOutputStream方法将对象附加到相同的writeObject()。读取时,它们的读取顺序与写入时相同。另外,您可能会收到该错误,因为您的流已缓冲且未写入。您应该使用flush()方法来确保已将缓冲区写入文件。
让我们将两个对象写入同一文件并读取它们:

Person mahmoud_kanbar = new Student(21,224466,"Mahmoud Kanbar","ITE");
Person omid = new Student(18,200000,"Omid Nejadabbasi","ITE");

try {

        FileOutputStream out = new FileOutputStream("Hello.dat",true);
        ObjectOutputStream objectOut = new ObjectOutputStream(out);
        objectOut.writeObject(mahmoud_kanbar);
        objectOut.writeObject(omid);
        objectOut.flush();
        objectOut.close();
        out.close();

        FileInputStream in = new FileInputStream("Hello.dat");

        ObjectInputStream objectIn = new ObjectInputStream(in);


        Person newPerson= (Person)  objectIn.readObject();
        newPerson.printInfo();
        newPerson= (Person)  objectIn.readObject();
        newPerson.printInfo();

        objectIn.close();
        in.close();

    } catch (Exception e) {

        System.out.println(e);

    }

readObject()反序列化序列化到流中的下一个Object。