java.io.StreamCorruptedException:在java代码中

时间:2013-10-21 07:56:48

标签: java swing awt

如何读取文件中的对象我使用的是ObjectInputStream和ObjectOutputStream class,用于读取和编写我的自定义类Student的Object,用于此演示。

编写和读取使用的代码::

            try
            {
                if(af.filepath==null || af.filepath=="")//file path
                {
                    JOptionPane.showMessageDialog(null, "Please Set File Path", "File Path Error", JOptionPane.ERROR_MESSAGE);
                }
                else
                {
                    FileOutputStream fs=new FileOutputStream(af.filepath,true);
                    ObjectOutputStream fo=new ObjectOutputStream(fs);   
                    fo.writeObject(af.s);//write the Super Class Object
                    fo.close();
                }

            }
            catch (Exception ex)
            {
                    System.out.println(ex);
            }

   ---------------------------------------------------------------------------------
        try
        {
            if(af.filepath==null || af.filepath=="")//file path have whole path of the file
            {
                JOptionPane.showMessageDialog(null, "Please Set File Path", "File Path Error", JOptionPane.ERROR_MESSAGE);
            }
            else
            {
                Student sp;
                FileInputStream fs=new FileInputStream(af.filepath);
                ObjectInputStream fo=new ObjectInputStream(fs);
                while ((sp=(Student)fo.readObject())!=null) 
                {
                    sp.set();//for print object
                }
                fo.close();
            }

        }
        catch (Exception ex)
        {
                ex.printStackTrace();
        }

使用这个我读取文件中的第一个对象,但之后引发错误

1 个答案:

答案 0 :(得分:1)

您编写了一个对象,并且您正在尝试读取多个对象。当您尝试读取第二个时,您将遇到异常。

如果你想回读无限数量的对象......就像那样...我建议你一个null到流:

    fo.writeObject(null);

(javadoc并没有说你可以这样做,但Java对象序列规范说你可以;参见http://docs.oracle.com/javase/7/docs/platform/serialization/spec/output.html#933 ...步骤3。)


另一个问题(这就是导致损坏的原因)是您正在尝试序列化对象追加到现有文件中。那不行。序列化协议表示流包含一个标头,后跟零个或多个序列化对象......然后是文件末尾。如果您将一个流附加到另一个流(例如FileOutputStream(path, true),则额外的标头将使附加内容开始时的组合文件可读。