0

我正在尝试读取一个文件,其中包含多个分隔消息(数千个),如何使用 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 - 将消息存储到文件中

但是,当使用 .parseDelimitedFrom() 时,它只读取第一条消息。(我不知道如何使用 parseDelimitedFrom() 读取整个文件)。

此评论说使用 CodedOutputStream 编写分隔消息:Google 协议缓冲区 - 将消息存储到文件中(即 writer.writeRawVariant())。我目前正在使用此评论的实现来读取整个文件。writeDelimitedTo() 基本上做同样的事情吗

writer.writeRawVarint32(bytes.length); 

 writer.writeRawBytes(bytes);

另外,如果我的方式不是读取由分隔消息组成的整个文件的正确方式,你能告诉我是什么吗?

谢谢你。

4

1 回答 1

3

是的,writeDelimitedTo()只需将长度写为 varint 后跟字节字节。CodedOutputStream如果您使用 Java,则无需直接使用。

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

于 2015-01-29T04:21:50.710 回答