gpt4 book ai didi

java - 如何在 Google Protobufs 中完整读取带有分隔消息的文件?

转载 作者:行者123 更新时间:2023-12-02 05:01:54 26 4
gpt4 key购买 nike

我正在尝试读取一个文件,其中包含多条分隔消息(数千条),如何使用 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 后跟字节。如果您使用 Java,则无需直接使用 CodedOutputStream

parseDelimitedFrom() 解析一条消息,但您可以重复调用它来解析 InputStream 中的所有消息。当您到达流末尾时,该方法将返回 null

关于java - 如何在 Google Protobufs 中完整读取带有分隔消息的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com