如果你的输入流中由多组定界消息组成,形如下结构:
![]()
其中Delimiter是下一个Event的数据长度。
可以直接调用writeDelimitedTo(),传入你的对象即可。protobufs会自己计算出数据长度,写成delimiter。
同样,用parseDelimitedFrom()就可以开箱即用得读取数据,你并不需要关系Delimiter是多少。
下面两者方式一样。parseDelimitedFrom就是parseFrom(CodedInputStream)的一层封装。(Ref: AbstractParser. parsePartialDelimitedFrom(InputStream input, ExtensionRegistryLite extensionRegistry))
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(filePath));
while (true){
EventOuterClass.Event event = EventOuterClass.Event.parseDelimitedFrom(bin);
if (event == null){
break;
}
}
CodedInputStream inputStream = CodedInputStream.newInstance(bin);
while (!inputStream.isAtEnd()) {
int len = inputStream.readRawVarint32();
EventOuterClass.Event event = EventOuterClass.Event.parseFrom(inputStream.readRawBytes(len));
}
本文介绍了如何使用Protobuf的writeDelimitedTo()和parseDelimitedFrom()方法处理包含多组定界消息的数据流。通过这两个方法,可以方便地读写带有长度前缀的消息,无需手动处理分隔符。示例代码展示了如何从BufferedInputStream读取和解析Event对象,直到流结束。这种方法在处理不定长消息时非常实用。

被折叠的 条评论
为什么被折叠?



