Java 如何写入/读取表示对象的二进制文件?

Java 如何写入/读取表示对象的二进制文件?,java,binaryfiles,Java,Binaryfiles,我是Java编程新手,遇到了以下问题: 我正在创建一个程序,该程序读取.csv文件,将其行转换为对象,然后操作这些对象。 更具体地说,应用程序读取每一行,给它一个索引,还从这些行中读取某些值,并将它们存储在TRIE树中。 然后,应用程序可以从树中存储的值中读取索引,然后检索相应行的完整信息 我的问题是,尽管我最近几天一直在研究,但我不知道如何在二进制文件中编写这些结构,也不知道如何读取它们。 我想将这些行(及其索引)写入一个二进制索引文件中,并只读取从数据库中检索到的确切索引 对于树的书写,我正

我是Java编程新手,遇到了以下问题:

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

我的问题是,尽管我最近几天一直在研究,但我不知道如何在二进制文件中编写这些结构,也不知道如何读取它们。 我想将这些行(及其索引)写入一个二进制索引文件中,并只读取从数据库中检索到的确切索引

对于树的书写,我正在寻找这样的东西(在C中)

对于“二进制索引文件”,我想写一些像TRIEs这样的对象,也许在读到足够多的内容达到相应的索引之前读取每个对象,但这可能不是很有效

总而言之,我需要在二进制文件中写入和读取对象方面的帮助,以及如何创建索引文件的解决方案。

我认为(对于初学者来说)在尝试序列化时,您是最好的选择

下面是stackoverflow的一个示例:

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


无可否认,这还不能解决索引创建问题。

这里有一种替代Java本机序列化的方法,即Google协议缓冲区

我将主要在这个答案中直接引用文档,所以如果您对更多细节感兴趣,请务必遵循答案末尾的链接

是什么:

协议缓冲区是Google用于序列化结构化数据的语言中立、平台中立、可扩展的机制——比如XML,但更小、更快、更简单

换句话说,您可以用Java序列化您的结构,并在.net、pyhton等处进行反序列化。这是Java本机序列化中所没有的

性能:

这可能因用例而异,但原则上GPB应该更快,因为它的构建考虑了性能和互换性。 下面是讨论Java本机与GPB的堆栈溢出链接:

它是如何工作的:

通过在.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);
请在此处阅读所有相关内容:


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

您要寻找的术语是序列化。您能告诉我们更多有关要存储的对象数量的信息吗?根据一个简单的HashMap可能对索引执行的数字。@Marged我要存储的对象数量可能会有所不同。我想专门存储3次尝试,其他对象取决于用户的输入。除了尝试之外,我当前的测试文件还有大约30个要存储的对象。这解决了我的问题。这正是我在尝试寻找的东西,它可能不是最好的解决方案,但我将.csv中的每一行都转换为一个对象,并将其扔到一个文件中。谢谢我已经将我的申请发送到avaliation(大学项目),但我将非常明确地检查这一点,并进行一些测试,以便在下一个项目中使用它。谢谢
Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
output = new FileOutputStream(args[0]);
john.writeTo(output);