Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ObjectOutputStream读取多个对象时发生java.io.StreamCorruptedException错误_Java_Io - Fatal编程技术网

使用ObjectOutputStream读取多个对象时发生java.io.StreamCorruptedException错误

使用ObjectOutputStream读取多个对象时发生java.io.StreamCorruptedException错误,java,io,Java,Io,我试图通过多次运行代码将多个对象保存到一个文件中。但是在第二次运行中,我得到了一个java.io.StreamCorruptedException错误 package BinaryIO; import java.io.*; public class OOSDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { File file = new F

我试图通过多次运行代码将多个对象保存到一个文件中。但是在第二次运行中,我得到了一个java.io.StreamCorruptedException错误

package BinaryIO;

import java.io.*;

public class OOSDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        File file = new File("src/BinaryIO/robotData.dat");
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file, true))) {
            oos.writeObject(new Robot());
            oos.flush();
        }
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
            while (true) {
                try {
                    System.out.println(ois.readObject().toString());
                } catch (EOFException e) {
                    break;
                }
            }
        }
    }
}

class Robot implements Serializable {
    int x, y;
    String model;

    public Robot() {
        this(0, 0, "Default");
    }

    public Robot(int x, int y, String model) {
        this.x = x;
        this.y = y;
        this.model = model;
    }

    @Override
    public String toString() {
        return String.format("Robot: (%d, %d), Model: %s", x, y, model);
    }
}
第二次运行时出错:

Robot: (0, 0), Model: Default
Exception in thread "main" java.io.StreamCorruptedException: invalid type code: AC
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1743)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477)
    at BinaryIO.OOSDemo.main(OOSDemo.java:14)
我无法确定问题所在。 在在线论坛上,它说如果出现以下情况,可能会发生错误:

  • 您尝试围绕一些并非使用ObjectOutputStream实际写入的数据打开ObjectInputStream
  • 在readObject()操作期间,流进入了“错误的位置”。

  • 请包括完整的堆栈跟踪,并指出是哪一行代码触发了错误(是这一部分
    ois.readObject().toString()
    ?)您没有关闭或刷新输出流,在打开它进行输入时,可能还没有写入所有数据。@sorifiend Yes。我已经更新了这个问题。@ShivPatel,因为:---当我说你不能追加时,我的意思是说你需要跳越额外的障碍才能使之生效。既然你不是,附加对你没用。“那些额外的圈圈是一种恶作剧。”希夫帕特尔也许如果你真的读了我链接到的答案,你就会知道了。重新封顶:OOS在第一个对象之前写入头。追加时,会写入一个新的头,OIS将无法读取该头。