如何读取文件中的对象我使用的是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();
}
使用这个我读取文件中的第一个对象,但之后引发错误
答案 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)
,则额外的标头将使附加内容开始时的组合文件可读。