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 プロトコル バッファ - メッセージをファイルに保存する

ただし、.parseDelimitedFrom() を使用すると、最初のメッセージのみが読み取られます。(parseDelimitedFrom() を使用してファイル全体を読み取る方法がわかりません)。

このコメントは、CodedOutputStream を使用して区切られたメッセージを書き込むことを示しています: Google プロトコル バッファ - ファイルへのメッセージの保存(つまり、writer.writeRawVariant())。現在、このコメントの実装を使用してファイル全体を読み取っています。writeDelimitedTo() は基本的に同じことをしますか

writer.writeRawVarint32(bytes.length); 

 writer.writeRawBytes(bytes);

また、区切られたメッセージで構成されるファイル全体を読み取るのに私の方法が適切でない場合は、どのようなものか教えていただけますか?

ありがとうございました。

4

1 に答える 1

3

はい、writeDelimitedTo()長さを varint として書き込み、その後にバイトが続きます。CodedOutputStreamJava で作業している場合は、直接使用する必要はありません。

parseDelimitedFrom()は 1 つのメッセージを解析しますが、繰り返し呼び出して、InputStream. nullストリームの最後に到達すると、メソッドは戻ります。

于 2015-01-29T04:21:50.710 に答える