【问题标题】:writing many java objects to a single file将许多 java 对象写入单个文件
【发布时间】:2020-01-09 00:56:27
【问题描述】:

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

【问题讨论】:

  • 完整的问题:我必须实现一个 B-Tree。我会为每个“节点”创建一个对象并将其存储在文件中。现在,当我稍后使用 b-tree 时,我想获取根并仅读取所需的节点。
  • 你还没说你为什么要这么做。我问的原因是,你可能会错误地认为这在某种程度上更快或更有效,而它更有可能只是不必要地复杂化。如果您有 100 MB 的数据,它可能开始值得,否则只需将整个结构读入内存并访问它。

标签: java serialization


【解决方案1】:

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

当你想读回“一些”对象时,困难的部分就来了。您将如何知道如何查找包含您想要的特定对象的文件中的位置?如果你总是按照你写对象的顺序读回对象,从文件的开头开始,这不会是一个问题。但是,如果您想随机访问流“中间”的对象,您将不得不想出一些方法来确定您感兴趣的特定对象的字节偏移量。

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

【讨论】:

  • 所以例如。我写1234。我是否必须将它们读为4321?在1234 中再次阅读它们对我来说没有意义。你能澄清一下吗?
【解决方案2】:

写作部分很简单。您只需要记住您必须“一次”写入所有对象。您不能创建带有序列化对象的文件,关闭它并再次打开它以附加更多对象。如果您尝试一下,您会在阅读时收到错误消息。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我会使用Flat File Database(例如Berkeley DB Java Edition)。只需将您的节点写成表格中的行,如下所示:

      Node
      ----
      id
      value
      parent_id
      

      【讨论】:

        【解决方案5】:

        从文件中读取更多对象:


        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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-17
          • 1970-01-01
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          相关资源
          最近更新 更多