如何使用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++做一样附加对象

您可以使用writeObject()方法将对象附加到同一个ObjectOutputStream。阅读时,它们的阅读顺序与书写时相同。此外,您可能会得到这个错误,因为您的流是缓冲的,而不是写入的。您应该使用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进行反序列化。

最新更新