将多个java对象写入单个文件
如何将多个可序列化对象写入单个文件,然后在需要时读取一些对象?您必须自己实现索引功能,否则就可以实现。当您序列化一个对象时,实际上会返回一个将多个java对象写入单个文件,java,serialization,Java,Serialization,如何将多个可序列化对象写入单个文件,然后在需要时读取一些对象?您必须自己实现索引功能,否则就可以实现。当您序列化一个对象时,实际上会返回一个OutputStream,您可以将其指向任何您想要的地方。以这种方式将多个对象存储到一个文件中是很简单的 当你想读回“一些”物体时,困难的部分就来了。您将如何知道如何查找文件中包含所需特定对象的位置?如果您总是按照写入对象的相同顺序读取对象,从文件开始,这将不会是一个问题。但是,如果您想随机访问流“中间”的对象,您必须想出一些方法来确定您感兴趣的特定对象的字
OutputStream
,您可以将其指向任何您想要的地方。以这种方式将多个对象存储到一个文件中是很简单的
当你想读回“一些”物体时,困难的部分就来了。您将如何知道如何查找文件中包含所需特定对象的位置?如果您总是按照写入对象的相同顺序读取对象,从文件开始,这将不会是一个问题。但是,如果您想随机访问流“中间”的对象,您必须想出一些方法来确定您感兴趣的特定对象的字节偏移量
(这种方法与同步甚至与Java本身无关;您必须设计一种适合您的需求和环境的方案。)编写部分很简单。您只需要记住,您必须“一次”写入所有对象。无法创建包含序列化对象的文件,请关闭该文件,然后再次打开以附加更多对象。如果您尝试,您将在阅读时收到错误消息 对于反序列化,我认为您必须处理完整的文件并保留您感兴趣的对象。其他的将被创建,但在下一次由gc收集。我将使用一个(例如)。只需将节点作为行写入表中,如下所示:
Node
----
id
value
parent_id
使
对象[]
用于存储对象。它对我很有用。从文件中读取更多对象:
完整的问题是:我必须实现一个B-树。我将为每个“节点”创建一个对象,并将其存储在文件中。现在,当我稍后使用b-树时,我希望获得根并只读取所需的节点。您还没有说为什么要这样做。我提出这个问题的原因是,您可能会错误地认为这在某种程度上更快或更高效,而这很可能是不必要的编译。如果你有几个100MB的数据,它可能开始值得,否则只需将整个结构读入内存并访问它。例如,我写
1
,2
,3
,4
。我需要把它们读成4
,3
,2
,1
?在1
、2
、3
、4
中再次阅读它们对我来说没有意义。你能澄清一下吗?
public class ReadObjectFromFile {
public static Object[] readObject() throws IOException {
Object[] list = null;
try {
byte[] bytes = Files.readAllBytes(Paths.get("src/objectFile.txt"));
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
list = (Object[]) ois.readObject();
ois.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return list;
}
}