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