Jam*_*dle 7 java protocol-buffers
我们正在考虑使用Protocol Buffers进行二进制日志记录,因为:
这就是说,它不是很明显,我们应该如何去做,因为这些API往往把重点放在创建整个对象,所以包装DataLogEntry列表作为在DataLogFile重复场会是什么,你会在短信方面怎么做,但我们真正想要的只是能够编写然后读取整个DataLogEntry,将其附加到文件的末尾.
我们这样做的第一个问题是这样做(在测试中:
FileInputStream fileIn = new FileInputStream(logFile);
CodedInputStream in = CodedInputStream.newInstance(fileIn);
while(!in.isAtEnd()) {
DataLogEntry entry = DataLogEntry.parseFrom(in);
// ... do stuff
}
Run Code Online (Sandbox Code Playgroud)
仅导致从流中读取1个DataLogEntry.没有isAtEnd,它永远不会停止.
思考?
编辑:我已经切换到使用entry.writeDelimitedTo和BidLogEntry.parseDelimitedFrom,这似乎工作...
根据我对协议缓冲区的理解,它不支持单个流中的多个消息。因此,您可能需要自己跟踪消息的边界。您可以通过在日志中每条消息之前存储消息的大小来实现此目的。
public class DataLog {
public void write(final DataOutputStream out, final DataLogEntry entry) throws IOException {
out.writeInt(entry.getSerializedSize());
CodedOutputStream codedOut = CodedOutputStream.newInstance(out);
entry.writeTo(codedOut);
codedOut.flush();
}
public void read(final DataInputStream in) throws IOException {
byte[] buffer = new byte[4096];
while (true) {
try {
int size = in.readInt();
CodedInputStream codedIn;
if (size <= buffer.length) {
in.read(buffer, 0, size);
codedIn = CodedInputStream.newInstance(buffer, 0, size);
} else {
byte[] tmp = new byte[size];
in.read(tmp);
codedIn = CodedInputStream.newInstance(tmp);
}
DataLogEntry.parseFrom(codedIn);
// ... do stuff
}
catch (final EOFException e) {
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我使用 EOFException 来查找文件末尾,您可能希望使用分隔符或跟踪手动读取的字节数。
| 归档时间: |
|
| 查看次数: |
4253 次 |
| 最近记录: |