I use the protocol buffers CodedOutputStream and FileOutputStream to consecutively convert multiple messages to 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 with GzipOutputStream? Is it possible to re-open the compressed gzip file to add new messages, for example, using CodedOutputStream?
source share