有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在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);

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

多谢各位


共 (1) 个答案

  1. # 1 楼答案

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

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