当前位置: 首页 > 面试题库 >

序列化:java.io.StreamCorruptedException:无效的流头:0AACED00

松献
2023-03-14
问题内容

我是一名练习File
IO技能的学生,遇到使用ObjectInputStream从文件读取对象的问题。代码始终抛出InvalidClassException,但我找不到代码是如何将其在线或通过反复试验将其抛出的。这是我的代码:

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ReadFromFile {
String filename;
List<Object> os;

public ReadFromFile(String filename) {
    this.filename = filename;
    os = new ArrayList<>();
}

public Object[] readObject() {
    try {
        FileInputStream fis = new FileInputStream(filename);
        ObjectInputStream ois = new ObjectInputStream(fis);
        System.out.print("reading\n");
        while (true) {
            os.add(ois.readObject());
            System.out.print("read one\n");
        }
    } catch (EOFException e) {
        return os.toArray();
    } catch (FileNotFoundException e) {
        System.out.print("File not found\n");
        return os.toArray();
    } catch (ClassNotFoundException e) {
        System.out.print("Class not found\n");
        return os.toArray();
    } catch (StreamCorruptedException e) {
        System.out.print("SC Exception\n");
        e.printStackTrace();
        return os.toArray();
    } catch (InvalidClassException e) {
        e.printStackTrace();
        System.out.print("IC Exception\n");
        return os.toArray();
    } catch (OptionalDataException e) {
        System.out.print("OD Exception\n");
        return os.toArray();
    } catch (IOException e) {
        System.out.print("IO Exception\n");
        return os.toArray();
    }
}
}

我编写了所有单独的catch块,以弄清楚抛出了什么异常,并且该异常总是抛出InvalidClassException。

这也是我的树类:

import java.io.Serializable;

public class Tree implements Serializable {
private static final long serialVersionUID = -310842754445106856L;
String species;
int age;
double radius;

public Tree() {
    this.species = null;
    this.age = 0;
    this.radius = 0;
}
public Tree(String species, int age, double radius) {
    this.species = species;
    this.age = age;
    this.radius = radius;
}

public String toString() {
    return species + ", age: " + age + ", radius: " + radius;
}
}

这是我的写文件功能:

public boolean write(Object object) {
    try {
        File f = new File(filename);
        FileOutputStream fos = new FileOutputStream(f,true);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(object + "\n");
        oos.close();
    } catch (FileNotFoundException e) {
        System.out.print("File Not Found\n");
        return false;
    } catch (IOException e) {
        System.out.print("IOException\n");
        return false;
    }
    return true;
}

感谢您的知识…

堆栈跟踪:

SC Exception
java.io.StreamCorruptedException: invalid stream header: 0AACED00
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at ReadFromFile.readObject(ReadFromFile.java:17)
at WriteAndRecord.main(WriteAndRecord.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

流程结束,退出代码为0


问题答案:
 java.io.StreamCorruptedException: invalid stream header: 0AACED00

FileOutputStream.正如我在上面的评论中提到的那样,这是由于附加到您造成的ObjectOutputStream,至少在没有特殊措施的情况下,您无法附加到由编写的流。保持文件
ObjectOutputStream打开状态,直到你写你想写的对象,然后将其关闭,然后从它反序列化。

注意:我也提到过

while ((object = in.readObect()) != null)

不是有效的对象读取循环。readObject()在流的末尾不返回null:throws
EOFExceptionnull可以在流中的任何地方发生,只要您编写一个。循环的正确形式是:

try
{
    for (;;)
    {
        Object object = in.readObject();
        // ...
    }
}
catch (EOFException exc)
{
    // end of stream
}
// other catch blocks ...

注意2:

oos.writeObject(object + "\n");

应该只是

oos.writeObject(object);

否则,您将隐式调用toString()并毫无意义地追加行终止符,因此的结果readObject()将是String而不是原始对象。



 类似资料:
  • 问题内容: 我有一个使用对象进行通信的客户端服务器应用程序。 当我仅将一个对象从客户端发送到服务器时,一切正常。 当我尝试在同一流上一个接一个地发送多个对象时 有人可以指导我找出此错误的原因吗? 客户端写入方法 服务器读取方法 并且SecMessage类是 问题答案: 如果您要发送多个对象,通常最简单的方法是将它们放入某种持有人/收藏夹,例如or 。它省去了必须显式检查流结束的麻烦,并省去了显式传

  • 问题内容: 我不断得到这个得到这个: 服务器端我用它来发送和接收int,工作正常。 服务器: 客户: 但是,当我尝试像这样发送对象时,就会出现错误。 服务器: 客户: 任何帮助都会很好。这是我在游戏开始之前最初发送填字游戏的时间 根据jtahlborn的建议,我将代码更改为仅使用对象流,而不使用数据流 服务器 客户 问候,C. 问题答案: 不要用多个输入/输出流包装套接字流。这将以各种不良方式打破

  • 所以我见过很多不同的问题,但没有明确的帮助,至少对我的理解或我的个人应用。我正在制作一个套接字“聊天室”程序,允许用户通过中央服务器发送图像给选定的用户。我可以建立要连接的客户端,但当发送映像时,会出现此错误。下面是我的代码: 客户: 中央服务器主页: 中央服务器用户:

  • 问题内容: 关于如何解决此错误的任何想法?我在Hibernate中使用Spring JPA。下面的必要详细信息。 实体类别1: 用户的实体类: 和stacktrace: stacktrace非常大。我将下面的整个stacktrace粘贴以供参考,并在此处粘贴快速TL; DR: 完整的堆栈跟踪如下: 更新: 我将Ways实体类更新为以下内容,但仍然出现错误: 问题答案: 当无法反序列化某些内容时,就

  • 问题内容: Eclipse JDT编译器似乎存在一个问题,在某些情况下,Java 8 lamda不能正确反序列化,而是抛出。我正在使用最新发布的维护版本,如下所示: 现有的Bug / SO条目报告了已(至少部分地)已解决的类似问题。我已经亲自验证以下问题已解决。 访问实例字段和方法的Java 8Lambda不能反序列化 https://bugs.eclipse.org/bugs/show_bug.

  • Eclipse JDT编译器似乎有一个问题,在某些情况下,Java8个lamda没有正确反序列化,而是抛出一个。我正在使用最近的分布式维护版本,如下所示: 现有的bug/SO条目报告了在中已经(至少部分)解决的类似问题。我亲自验证了以下问题已经得到解决。 无法反序列化访问实例字段和方法的Java 8 lambda https://bugs.eclipse.org/bugs/show_bug.cgi