Java 如何写入/读取表示对象的二进制文件?
我是Java编程新手,遇到了以下问题: 我正在创建一个程序,该程序读取.csv文件,将其行转换为对象,然后操作这些对象。 更具体地说,应用程序读取每一行,给它一个索引,还从这些行中读取某些值,并将它们存储在TRIE树中。 然后,应用程序可以从树中存储的值中读取索引,然后检索相应行的完整信息 我的问题是,尽管我最近几天一直在研究,但我不知道如何在二进制文件中编写这些结构,也不知道如何读取它们。 我想将这些行(及其索引)写入一个二进制索引文件中,并只读取从数据库中检索到的确切索引 对于树的书写,我正在寻找这样的东西(在C中) 对于“二进制索引文件”,我想写一些像TRIEs这样的对象,也许在读到足够多的内容达到相应的索引之前读取每个对象,但这可能不是很有效 总而言之,我需要在二进制文件中写入和读取对象方面的帮助,以及如何创建索引文件的解决方案。我认为(对于初学者来说)在尝试序列化时,您是最好的选择 下面是stackoverflow的一个示例: (我认为复制和粘贴代码没有意义,请按照链接阅读)Java 如何写入/读取表示对象的二进制文件?,java,binaryfiles,Java,Binaryfiles,我是Java编程新手,遇到了以下问题: 我正在创建一个程序,该程序读取.csv文件,将其行转换为对象,然后操作这些对象。 更具体地说,应用程序读取每一行,给它一个索引,还从这些行中读取某些值,并将它们存储在TRIE树中。 然后,应用程序可以从树中存储的值中读取索引,然后检索相应行的完整信息 我的问题是,尽管我最近几天一直在研究,但我不知道如何在二进制文件中编写这些结构,也不知道如何读取它们。 我想将这些行(及其索引)写入一个二进制索引文件中,并只读取从数据库中检索到的确切索引 对于树的书写,我正
无可否认,这还不能解决索引创建问题。这里有一种替代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);