0

如何将对象读入文件我使用 ObjectInputStream 和 ObjectOutputStream 类来读取和写入我的自定义类 Student 的对象,用于此演示。

编写和读取代码使用::

            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();
        }

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

4

1 回答 1

1

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

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

    fo.writeObject(null);

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


另一个问题(这就是导致损坏的原因)是您试图将序列化对象附加到现有文件中。那是行不通的。序列化协议说一个流由一个标头组成,后跟零个或多个序列化对象......然后是文件的结尾。如果您将一个流附加到另一个流(例如FileOutputStream(path, true),额外的标头将使组合文件在附加内容开始的位置可读。

于 2013-10-21T08:10:44.400 回答