问题 将许多java对象写入单个文件


如何将多个可序列化对象写入单个文件,然后在需要时读取一些对象?


7543
2017-08-12 17:00


起源

完整的问题:我必须实现一个B树。我会为每个'Node'创建一个对象并将其存储在文件中。现在,当我以后使用b-tree时,我想得到root并只读取所需的节点。 - Anupam
你还没有说明为什么要这样做。我问的原因是你可能会错误地认为,当它更可能被不必要地编译时,它会以某种方式更快或更有效。如果你有几百MB的数据,它可能开始值得,否则只需将整个结构读入内存并访问它。 - Peter Lawrey


答案:


您必须自己实现索引方面,否则可以这样做。当你序列化一个对象时,你基本上会得到一个 OutputStream,你可以指向任何你想要的地方。以这种方式将多个对象存储到文件中将是直截了当的。

当你想要读回“几个”物体时,很难实现。您如何知道如何在包含您想要的特定对象的文件中寻找位置?如果你总是按照你编写它们的顺序读取对象,那么从文件开头开始,这不会有问题。但是如果你想随机访问流的“中间”中的对象,你将不得不想出一些方法来确定你感兴趣的特定对象的字节偏移量。

(这种方法与同步甚至Java本身无关;你必须设计一个符合你的要求和环境的方案。)


7
2017-08-12 17:08



所以对于例如。我写 1, 2, 3, 4。我是否必须阅读它们 4, 3, 2, 1?阅读它们对我来说没有意义 1, 2, 3, 4 再次。你能澄清一下吗? - ylun.ca


写作部分很容易。你必须记住,你必须“立刻”写下所有对象。您不能使用序列化对象创建文件,关闭它并再次打开它以附加更多对象。如果您尝试它,您将在阅读时收到错误消息。

对于反序列化,我认为你必须处理完整的文件并保留你感兴趣的对象。其他的将被创建,但下次由gc收集。


3
2017-08-12 17:52





使 Object[] 用于存储您的对象。它对我有用。


2
2017-12-20 19:47





我用了一个 平面文件数据库 (例如 Berkeley DB Java版)。只需将节点编写为表中的行,如:

Node
----
id
value
parent_id

0
2017-08-12 20:53