【问题标题】:How to write multiple objects to file?如何将多个对象写入文件?
【发布时间】:2011-12-11 12:26:19
【问题描述】:

我想将多个对象写入一个文件,但问题是我没有一次写入所有对象。我必须写一个对象,然后关闭文件,然后可能一段时间后我想将另一个对象添加到同一个文件中。

我目前正在这样做 FileOutputStream("filename", true) 以便它将对象附加到文件末尾而不是覆盖它。但我得到这个错误:

java.io.StreamCorruptedException:无效类型代码:AC

有什么想法可以解决这个问题吗?

谢谢,

【问题讨论】:

  • 如果您不需要随机访问对象,@Jon 的答案是正确的。但是,如果您这样做(即不想阅读所有这些),则需要文件开头(或结尾)的目录,其中包含一些偏移量、一些键和长度。或者只使用单独的文件,现在文件系统(尤其是 ext4)非常擅长有效地组织小文件(尤其是如果你有 SSD :D)
  • 谢谢大家,Jon 提出的解决方案看起来很强大,但对我来说太复杂了,所以我想我会满足于您的解决方案(为每个新对象创建单独的文件)或 EJP 的阅读解决方案旧对象,然后将所有旧+新对象写入文件增益。

标签: java file object


【解决方案1】:

您不能将不同的 ObjectOutputStream 附加到同一个文件。您将不得不使用不同形式的序列化,或者读入文件并将所有对象和新对象写出到新文件中。

【讨论】:

    【解决方案2】:

    你需要serialize/deserializeList<T>。看看thisstackoverflow 线程。

    【讨论】:

      【解决方案3】:

      一种选择是将文件分割成单独的消息。当你想写消息时,首先将其序列化为ByteArrayOutputStream。然后打开文件追加DataOutputStream - 用writeInt写入长度,然后写入数据。

      当您从流中读取时,您可以使用DataInputStream 打开它,然后反复调用readInt 来查找下一条消息的长度,然后再调用readFully 来读取消息本身。将消息放入ByteArrayInputStream,然后反序列化。

      或者,使用比内置 Java 序列化更好的序列化格式 - 我是 Protocol Buffers 的粉丝,但有很多替代方案可用。内置的序列化对我来说太脆弱了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多