如何在 Google Protobufs 中完整读取带有分隔消息的文件?
How to fully read a file with delimited messages in Google Protobufs?
我正在尝试读取一个文件,其中包含多条分隔消息(数以千计),如何使用 Google protobufs 正确地 执行此操作?
这就是我写分隔符的方式:
MyMessage myMessage = MyMessage.parseFrom(byte[] msg);
myMessage.writeDelimitedTo(FileOutputStream);
这就是我读取分隔文件的方式;
CodedInputStream is = CodedInputStream.newInstance(new FileInputStream("/location/to/file"));
while (!is.isAtEnd()) {
int size = is.readRawVarint32();
MyMessage msg = MyMessage.parseFrom(is.readRawBytes(size));
//do stuff with your messages
}
我有点困惑,因为这个问题中接受的答案是使用 .parseDelimitedFrom() 来读取分隔字节; Google Protocol Buffers - Storing messages into file
但是,当使用 .parseDelimitedFrom() 时,它只读取第一条消息。 (我不知道如何使用 parseDelimitedFrom() 读取整个文件)。
这条评论说要使用 CodedOutputStream 编写定界消息:Google Protocol Buffers - Storing messages into file(即 writer.writeRawVariant())。我目前正在使用此注释的实现来读取整个文件。 writeDelimitedTo() 基本上做与
相同的事情吗
writer.writeRawVarint32(bytes.length);
和
writer.writeRawBytes(bytes);
此外,如果我的方法不是读取由分隔消息组成的整个文件的正确方法,您能告诉我什么是正确的方法吗?
谢谢。
是的,writeDelimitedTo()
只是将长度写为 varint 后跟 byte 字节。如果您在 Java.
中工作,则无需直接使用 CodedOutputStream
parseDelimitedFrom()
解析一条消息,但是你可以多次调用它来解析InputStream
中的所有消息。当您到达流的末尾时,该方法将 return null
。
我正在尝试读取一个文件,其中包含多条分隔消息(数以千计),如何使用 Google protobufs 正确地 执行此操作?
这就是我写分隔符的方式:
MyMessage myMessage = MyMessage.parseFrom(byte[] msg);
myMessage.writeDelimitedTo(FileOutputStream);
这就是我读取分隔文件的方式;
CodedInputStream is = CodedInputStream.newInstance(new FileInputStream("/location/to/file"));
while (!is.isAtEnd()) {
int size = is.readRawVarint32();
MyMessage msg = MyMessage.parseFrom(is.readRawBytes(size));
//do stuff with your messages
}
我有点困惑,因为这个问题中接受的答案是使用 .parseDelimitedFrom() 来读取分隔字节; Google Protocol Buffers - Storing messages into file
但是,当使用 .parseDelimitedFrom() 时,它只读取第一条消息。 (我不知道如何使用 parseDelimitedFrom() 读取整个文件)。
这条评论说要使用 CodedOutputStream 编写定界消息:Google Protocol Buffers - Storing messages into file(即 writer.writeRawVariant())。我目前正在使用此注释的实现来读取整个文件。 writeDelimitedTo() 基本上做与
相同的事情吗writer.writeRawVarint32(bytes.length);
和
writer.writeRawBytes(bytes);
此外,如果我的方法不是读取由分隔消息组成的整个文件的正确方法,您能告诉我什么是正确的方法吗?
谢谢。
是的,writeDelimitedTo()
只是将长度写为 varint 后跟 byte 字节。如果您在 Java.
CodedOutputStream
parseDelimitedFrom()
解析一条消息,但是你可以多次调用它来解析InputStream
中的所有消息。当您到达流的末尾时,该方法将 return null
。