如何在Google Protobufs中完全读取带有分隔邮件的文件?

时间:2015-01-28 13:52:23

标签: java protocol-buffers delimited

我正在尝试阅读一个文件,其中包含多个分隔的邮件(成千上万),如何使用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);

另外,如果我的方式不是读取包含分隔信息的整个文件的正确方法,那么请告诉我这是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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