如何编写/读取代表对象的二进制文件?

时间:2015-06-11 21:26:24

标签: java binaryfiles

我是Java编程的新手,我遇到了这个问题:

我正在创建一个程序来读取.csv文件,将其行转换为对象,然后操纵这些对象。 更具体的是,应用程序读取每行给它一个索引,并从这些行中读取某些值并将它们存储在TRIE树中。 然后,应用程序可以从存储在树中的值中读取索引,然后检索相应行的完整信息。

我的问题是,即使我在过去几天一直在研究,我也不知道如何在二进制文件中编写这些结构,也不知道如何阅读它们。 我想在二进制索引文件中写入行(及其索引),并只读取从TRIE中检索到的确切索引。

对于树木写作,我正在寻找类似的东西(在C中)

fwrite(tree, sizeof(struct TrieTree), 1, file)

对于“二进制索引文件”,我正在考虑编写像TRIE这样的对象,并且可能会读取每个对象,直到我已经阅读到足以达到相应的索引,但这可能效率不高。

重述一下,我需要帮助编写和阅读二进制文件中的对象以及如何创建索引文件的解决方案。

2 个答案:

答案 0 :(得分:2)

我认为(对于初学者)在尝试使用序列化时最好。

以下是stackoverflow的一个示例:What is object serialization?

(我认为代码的复制和粘贴没有意义,请点击链接阅读)

不可否认,这还没有解决您的索引创建问题。

答案 1 :(得分:2)

以下是Java本机序列化的一种替代方法,即Google Protocol Buffers。

我将在本回答中主要编写文档中的直接引用,因此如果您对更多详细信息感兴趣,请务必按照答案末尾的链接进行操作。

它是什么:

协议缓冲区是Google与语言无关,平台无关的可扩展机制,用于序列化结构化数据 - 想想XML,但更小,更快,更简单。

换句话说,您可以使用Java序列化您的结构并在.net,pyhton等处反序列化。这是您在java native serialization中没有的。

<强>性能:

这可能会根据使用情况而有所不同,但原则上GPB应该更快,因为它的性能和可互换性考虑在内。 这是堆栈溢出链接,讨论Java native vs GPB:

High performance serialization: Java vs Google Protocol Buffers vs ...?

工作原理:

通过在.proto文件中定义协议缓冲区消息类型,指定希望如何构建序列化信息。每个协议缓冲区消息都是一个小的逻辑信息记录,包含一系列名称 - 值对。这是一个.proto文件的一个非常基本的例子,它定义了一个包含有关人员信息的消息:

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

一旦定义了消息,就可以在.proto文件上运行应用程序语言的协议缓冲区编译器来生成数据访问类。它们为每个字段提供了简单的访问器(如name()和set_name()),以及将整个结构序列化/解析为原始字节的方法。

然后,您可以在应用程序中使用此类来填充,序列化和检索Person协议缓冲区消息。然后你可以写一些像这样的代码:

Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
output = new FileOutputStream(args[0]);
john.writeTo(output);

在这里阅读所有相关内容: https://developers.google.com/protocol-buffers/

您可以将GPB视为XSD的替代格式,描述XML结构,更紧凑,序列化更快。