在文件中写入多个对象并读取它们

时间:2014-03-01 10:46:38

标签: java serialization

我正在尝试使用用户界面创建一个简单的程序。来自gui的用户插入Person Implements Serializable类的名称,姓氏和年龄。

一切都很好,但只有一个人,第一个人!似乎每次我将新对象发送到我的文件时,它确实被写入文件,因为文件大小越来越大。

问题是当我用对象读取文件时它只返回一个,我希望返回存储在myFile中的所有类人物对象。

以下是我的代码的预览:

写对象按钮:

try {
    per = new Person(name, sur, age);
    FileOutputStream fos = new FileOutputStream("myFile", true);
    ObjectOutputStream oos;
    oos = new ObjectOutputStream(fos);
    oos.writeObject(per);
    oos.flush();
    oos.close();
    //some other code here
} catch (IOException e) {
    //some code here
}

读取对象按钮:

try {
    FileInputStream fis = new FileInputStream("myFile");
    ObjectInputStream ois;
    ois = new ObjectInputStream(fis);
    try {
        rper = (Person) ois.readObject();
        ois.close();
        JOptionPane.showMessageDialog(null, "People:" + rper, "Saved Persons", JOptionPane.INFORMATION_MESSAGE);
    } catch (ClassNotFoundException e) {
        //some code here
    }
} catch (IOException e) {
    //some code here
}

感谢您的任何信息!

2 个答案:

答案 0 :(得分:3)

每次打开文件时,都会向其写入标题。当输入流阅读器在第一次读取后看到此标头时,它会抛出异常。由于您的异常处理中没有任何“printStackTrace”调用,因此您没有看到该错误。

修复是为了防止在打开流时在后续调用中写入标头。通过在打开文件之前检查文件是否存在来执行此操作,如果文件已经存在,请使用不写标头的ObjectOuputStream子类。

        boolean exists = new File("myFile").exists();
        FileOutputStream fos = new FileOutputStream("myFile", true);
        ObjectOutputStream oos = exists ? 
            new ObjectOutputStream(fos) {
                protected void writeStreamHeader() throws IOException {
                    reset();
                }
            }:new ObjectOutputStream(fos);

然后,您可以使用单个对象输入流读取所有记录...

        FileInputStream fis = new FileInputStream("myFile");
        ObjectInputStream ois = new ObjectInputStream(fis);
        while(fis.available() > 0) {
            try {
                Object rper = ois.readObject();
                JOptionPane.showMessageDialog(null, "People:" + rper, "Saved Persons", JOptionPane.INFORMATION_MESSAGE);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        ois.close();

答案 1 :(得分:2)

FileOutputStream fos = new FileOutputStream("myFile" , true);

你不能以这种方式append到文件。 grammar of the serialization protocol简要说明:

stream:
  magic version contents

contents:
  content
  contents content

您正在乱丢多个magic number和版本字段的文件,当反序列化程序遇到这些时,它会抛出错误。您必须读取所有已提交的值并将它们复制到新文件,最后写入新条目。