-->

对象序列化和Java中随机访问(Object serialization and random ac

2019-10-21 09:29发布

你可以使用Java内置的对象序列化与随机访问文件? 我的动机是我的回答这个问题 。

Answer 1:

你可以使用序列与随机访问文件,但你必须建立自己的基础设施。 有没有办法让序列化的大小,而不实际序列化。

我假设你要多个序列化对象存储在同一个文件,所以你需要做的是这样的:

  1. 存储序列化对象,保持流,直到年底内轨道偏移,然后在文件的结尾写的目录。 这类似于ZIP文件格式。

-要么-

  1. 写出大小“占位”的字节,然后序列化对象到流,再求回占位符和写入实际写入的字节数。


Answer 2:

你可以(使用Java的ByteArrayOutputStream和ByteArrayInputStream的 ),但是这将是一个非常糟糕的主意。 Java的内置对象序列化不无记忆。 “对象必须从具有相同类型和为他们写相同的顺序相应的ObjectInputStream读回。” 你可以解决这个问题通过为每个创建的ObjectOutputStream / ObjectInputStream中的一个新的实例对象,你读/写,但是这将让你的文件过大。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

        objectOutputStream.writeObject(1);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();

        objectOutputStream.writeObject(2);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();

        objectOutputStream.writeObject(2);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();

        objectOutputStream.writeObject(3);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();

        objectOutputStream.close();
    }
}

产量

  • 81
  • 10
  • 10


文章来源: Object serialization and random access in java