java.io.StreamCorruptedException:无效的流头:EFBBBFAC

java.io.StreamCorruptedException:无效的流头:EFBBBFAC,java,serialization,objectinputstream,Java,Serialization,Objectinputstream,我正在使用ObjectOutputStream和ObjectInputStream编写一个func,以将联系人信息导入和导出到文件中 我有一个异常java.io.StreamCorruptedException:invalid stream header:EFBBBFAC在ObjectInputStream的一部分,我不知道如何修复它 如何修复它,谢谢 LienHe lh = new LienHe(name, phone, img); try { ObjectOutput

我正在使用ObjectOutputStream和ObjectInputStream编写一个func,以将联系人信息导入和导出到文件中

我有一个异常java.io.StreamCorruptedException:invalid stream header:EFBBBFAC在ObjectInputStream的一部分,我不知道如何修复它

如何修复它,谢谢

LienHe lh = new LienHe(name, phone, img);
    try {
        ObjectOutputStream out = new ObjectOutputStream(
                                 new FileOutputStream("src/Bai6/lienhe.txt", true));
        out.writeObject(lh);
        out.close();
    } catch (FileNotFoundException ex) {
        Logger.getLogger(FrmThemLienHe.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(FrmThemLienHe.class.getName()).log(Level.SEVERE, null, ex);
    }



lst = new ArrayList<>();
    try {// exception
        ObjectInputStream in = new ObjectInputStream(
                               new FileInputStream("src/Bai6/lienhe.txt")));
        while (in.available() > 0) {
            LienHe lh = (LienHe) in.readObject();
            lst.add(lh);
        }
    } catch (ClassNotFoundException | IOException ex) {
        System.out.println(ex.getMessage());
    }
LienHe lh=新LienHe(姓名、电话、img);
试一试{
ObjectOutputStream out=新的ObjectOutputStream(
新的FileOutputStream(“src/Bai6/lienhe.txt”,true));
out.writeObject(左侧);
out.close();
}捕获(FileNotFoundException ex){
Logger.getLogger(frmthemlinehe.class.getName()).log(Level.SEVERE,null,ex);
}捕获(IOEX异常){
Logger.getLogger(frmthemlinehe.class.getName()).log(Level.SEVERE,null,ex);
}
lst=新的ArrayList();
尝试{//异常
ObjectInputStream in=新ObjectInputStream(
新文件输入流(src/Bai6/lienhe.txt);
while(in.available()>0){
LienHe lh=(LienHe)in.readObject();
第一次添加(左侧);
}
}捕获(ClassNotFoundException | IOException ex){
System.out.println(例如getMessage());
}

如果不采取特殊措施,您就不能附加到
ObjectOutputStream
。您应该序列化集合,并在执行此操作时替换整个文件。

您没有这样说,但我假设您正在多次运行第一段代码(附加到同一文件),然后运行第二段代码一次。。。读取您编写的所有对象

实际上,您正在连接多个对象流,并尝试将其作为单个流读取

那不行。问题是每个流都以一个特殊的头开始。当您尝试将连接作为单个流读取时,读取器将看到意外的头。这就是导致您看到的异常的原因


解决方案是重新构造代码,以便编写器将所有对象写入同一个ObjectOutputStream。

可能不相关,但.available()中的
in
并没有按照您的想法执行。起初我使用while(true)但是发生了一个错误,我在互联网上搜索,看到人们这样做。正确的和你看到的不一定是同一件事。请参阅Javadoc<代码>可用()。您应该只注意编写好的源代码提供的示例。