I'm using protocol buffers' CodedOutputStream and FileOutputStream to serialize multiple messages in sequence into a file like this:
// File is opened using append mode and wrapped into
// a FileOutputStream and a CodedOutputStream
bool Open(const std::string& filename,
int buffer_size = kDefaultBufferSize) {
file_ = open(filename.c_str(),
O_WRONLY | O_APPEND | O_CREAT, // open mode
S_IREAD | S_IWRITE | S_IRGRP | S_IROTH | S_ISUID); //file permissions
if (file_ != -1) {
file_ostream_ = new FileOutputStream(file_, buffer_size);
ostream_ = new CodedOutputStream(file_ostream_);
return true;
} else {
return false;
}
}
// Code for append a new message
bool Serialize(const google::protobuf::Message& message) {
ostream_->WriteLittleEndian32(message.ByteSize());
return message.SerializeToCodedStream(ostream_);
}
// Code for reading a message using a FileInputStream
// wrapped into a CodedInputStream
bool Next(google::protobuf::Message *msg) {
google::protobuf::uint32 size;
bool has_next = istream_->ReadLittleEndian32(&size);
if(!has_next) {
return false;
} else {
CodedInputStream::Limit msgLimit = istream_->PushLimit(size);
if ( msg->ParseFromCodedStream(istream_) ) {
istream_->PopLimit(msgLimit);
return true;
}
return false;
}
}
How can I do the same using a GzipOutputStream? Can a gzip compressed file be reopened to append new messages like I do using CodedOutputStream?
I've just realized that I just need to wrap the the FileOutputStream in another GzipOutputStream like this:
file_ostream_ = new FileOutputStream(file_, buffer_size);
gzip_ostream_ = new GzipOutputStream(file_ostream_);
ostream_ = new CodedOutputStream(gzip_ostream_);
and when reading, just do the same:
file_istream_ = new FileInputStream(file_, buffer_size);
gzip_istream_ = new GzipInputStream(file_istream_);
istream_ = new CodedInputStream(gzip_istream_);
Close and reopen the file to append messages also works fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With