2012-12-07 8 views
6

Sto usando CodedOutputStream buffer di protocollo e FileOutputStream per serializzare più messaggi in sequenza in un file in questo modo:Come scrivere più messaggi di buffer di protocollo in un file compresso appendibile?

// 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; 
    } 
} 

Come posso fare lo stesso utilizzando un GZIPOutputStream? È possibile riaprire un file compresso con gzip per aggiungere nuovi messaggi come faccio con CodedOutputStream?

risposta

1

Ho appena realizzato che ho solo bisogno di avvolgere la FileOutputStream in un altro GZIPOutputStream come questo:

file_ostream_ = new FileOutputStream(file_, buffer_size); 
gzip_ostream_ = new GzipOutputStream(file_ostream_); 
ostream_ = new CodedOutputStream(gzip_ostream_); 

e durante la lettura, basta fare lo stesso:

file_istream_ = new FileInputStream(file_, buffer_size); 
gzip_istream_ = new GzipInputStream(file_istream_); 
istream_ = new CodedInputStream(gzip_istream_); 

chiudere e riaprire anche il file per aggiungere messaggi funziona correttamente.

Problemi correlati