【问题标题】:Appending Objects to a .txt file [duplicate]将对象附加到 .txt 文件 [重复]
【发布时间】:2012-06-03 15:43:16
【问题描述】:

我正在尝试在“序列化”一章末尾的练习中给出的程序。

程序要求我声明一个 Person 类,它只封装了 Name 和 Address 类型的两个数据成员,它们也是类。 然后我必须从键盘上获取一系列名称和地址,创建对象并将它们写入文件。 但是,如果文件已经存在,则必须将对象附加到现有文件中。 我的程序第一次运行完美,但第二次,当我尝试回读附加记录时,我得到一个异常

java.io.StreamCorruptedException: invalid type code: AC 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at Trial.main(Trial.java:66) 

我对此进行了一些研究,发现 StreamHeader 只能写入一次,并且附加会破坏它。 有什么办法吗???
对象编写代码为:

try(ObjectOutputStream stream = new ObjectOutputStream(new BufferedOutputStream(Files.newOutputStream(filePath,WRITE,CREATE,APPEND)))) {
        for(int i = 0;i<name.length;i++) {
            Person aPerson = new Person(name[i],address[i]);
            System.out.println(aPerson);
            stream.writeObject(aPerson);
            stream.reset();
            aPerson = null;
        }
        System.out.println("Writing Complete");

【问题讨论】:

  • Extension .txt 建议该文件包含人类可读的文本。对象流是二进制的。
  • 序列化不产生文本。您没有将对象附加到文本文件,也不应该使用 .txt 文件扩展名。

标签: java objectoutputstream


【解决方案1】:

是的,我自己以前也遇到过这个问题……很遗憾,这是不可能的。

您可以做的是将您的对象放入一个列表并一次保存完整列表。由于列表是一个对象,它可以很容易地持久化。我知道这很糟糕,因为这需要将全部内容读入内存,但据我所知,这是唯一的方法。

另一个选项(我推荐)是您使用像 JSon 这样的东西来提交您的数据。 GSon 非常适合此目的。然后,您可以简单地编组和解组可以提交到文本文件的对象。这很容易做到,因为无论哪种方式都需要一行代码(对象到 JSon-string,反之亦然)。

【讨论】:

  • @Mat 我是初学者 :) 我当时的想法(一种相当麻烦的方式)是读回对象,然后将它们与新对象一起写回。但是这不是很有效:) 你是说 LINKED LIST 吗?
  • 是的,我愿意。我用 LinkedList 或 ArrayList 就可以了。 (我们都是初学者:-))我同意你的说法,它很麻烦,但是 ObjectOutputStream 不会添加多条记录。
  • 我不知道 ArrayList :)
  • @bozho 我必须运行代码两次,以便添加用户提供的更多名称和地址:) 除此之外,为了编写一次,我的程序可以正常工作很好 @banthar 我知道,但我只是将它保存在 txt 中以便能够打开并查看它是如何编写的 :) 你实际上可以看到写入的文本数据 :)
【解决方案2】:

这行得通。所以调试你的程序,看看为什么它没有。应该不会打reset()

public class ClassTest {

    public static void main(String a[]) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:/temp/foo.txt"));
        oos.writeObject(new Test("foo", "bar"));
        oos.writeObject(new Test("baz", "brr"));
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:/temp/foo.txt"));
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        ois.close();
    }
}

class Test implements Serializable {
    private String fld1;
    private String fld2;
    public Test(String v1, String v2) {
        this.fld1 = v1;
        this.fld2 = v2;
    }

    @Override
    public String toString() {
        return "Test [fld1=" + fld1 + ", fld2=" + fld2 + "]";
    }
}

【讨论】:

  • Bozho 您在没有关闭输出流的情况下编写了两次测试对象。如果您关闭流然后重新打开,则会出现此问题。我也有这样的问题。 java.io.StreamCorruptedException:无效类型代码:AC 任何一个帮助
  • @user2433486 这就是。他告诉你不要关闭对象写入之间的流。
猜你喜欢
  • 2021-05-05
  • 2018-02-28
  • 2012-11-23
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2018-05-21
  • 2015-11-01
  • 2019-09-21
相关资源
最近更新 更多