Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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
Java 读取多个对象时发生streamcorrupted异常_Java_Serialization - Fatal编程技术网

Java 读取多个对象时发生streamcorrupted异常

Java 读取多个对象时发生streamcorrupted异常,java,serialization,Java,Serialization,我向一个文件写入了2个对象,但当我试图读回写入的对象时,它在desriaze方法中抛出了一个异常。当我写一个对象时,它可以正常工作,但在文件中写入两个对象时失败,并且在读取第二个对象时引发异常 File_obj.Serialize_object(d, "/home/dasman/doc/serobj1.bin"); File_obj.Serialize_object(b, "/home/dasman/doc/serobj1.bin"); File_obj.deSerialize_object("

我向一个文件写入了2个对象,但当我试图读回写入的对象时,它在desriaze方法中抛出了一个异常。当我写一个对象时,它可以正常工作,但在文件中写入两个对象时失败,并且在读取第二个对象时引发异常

File_obj.Serialize_object(d, "/home/dasman/doc/serobj1.bin");
File_obj.Serialize_object(b, "/home/dasman/doc/serobj1.bin");
File_obj.deSerialize_object("/home/dasman/doc/serobj1.bin");



java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1373)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at Testpackage.File_obj.deSerialize_object(File_obj.java:242)
at File_test.main(File_test.java:28)
在File_obj类中序列化和反序列化的方法如下

public static void Serialize_object(Object obj,String filename){
    File a = new File(filename);
    ObjectOutputStream out = null;
    try{
     out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(a,true)));
    }catch(IOException e){
        e.printStackTrace();
    }
    try{

    out.writeObject(obj);
    out.close();
    }catch(IOException e){
        e.printStackTrace();
    }

}
    public static void deSerialize_object(String filename){
    File a = new File(filename);
    int objcount = 0;
    ObjectInputStream in = null;
    try{
     in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(a)));
    }catch(IOException e){
        e.printStackTrace();
    }
    Serializable_test obj1 = null;
    try{
    while(true){    

    obj1 = (Serializable_test) in.readObject();
    objcount++;
    System.out.println("The object area is :" + obj1.get_area());

    }
    }catch(EOFException e){
        System.out.println("END of object files reached objects read :" + objcount);
        //in.close();
    }catch(IOException e){
        e.printStackTrace();
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }


}

你的问题是什么?您正在将两个对象写入同一个文件中—当然,第二个对象将附加到第一个文件中—java无法处理此问题

要解决此问题,请执行以下操作之一:

  • A) 写入不同的文件,或
  • B) 将对象放入数组或集合(例如列表)中,并将其写入一个文件,反序列化数组/集合并从中检索对象

反序列化例程一次只能重新构成一个对象(或对象图)。它假定正在读取的序列化内容仅与单个对象相关,并将包含两个对象数据的文件视为已损坏。

您不能附加到通过ObjectOutputStream创建的文件。你必须重写整个文件。ObjectOutputStream写入一个头,如果它在文件中再次出现,ObjectOutputStream将无法理解该头


但是,您可以将多个对象写入同一个ObjectOutputStream,并将其读回,这与其他答案中所述的相反。

但是,如果您注意到我有FileOutputStream(a,true)),那么它应该附加到文件中,对吗?“您正在将两个对象写入同一个文件中-当然,第二个将覆盖第一个。”Nu uh-当
文件输出流(a,true)
设置为append.error时不正确。Java确实可以处理这个问题,只要它是在同一个ObjectInputStream中完成的。尽管在覆盖上犯了一个错误,波希米亚人还是提供了一些很好的解决方法。如果这些建议对你不起作用,我建议你发布一个.hmm,那么如果我一次编写一个对象数组而不关闭通道呢?那么它能重组所有的物体吗?是的。整个对象图将被序列化。这是波希米亚人的“B”建议。完全不正确。您可以编写任意数量的对象。但是您必须使用相同的ObjectOutputStream来编写它们。看看我的答案。