2012-12-07 7 views
6

Używam CodedOutputStream bufory protokołem i FileOutputStream serializować wielu wiadomości w kolejności do pliku jak poniżej:Jak napisać komunikaty wielu buforów protokołów do kompresowanego pliku z możliwością dodania?

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

jaki sposób można zrobić to samo przy użyciu GZIPOutputStream? Czy skompresowany plik gzip może zostać ponownie otwarty w celu dołączenia nowych wiadomości, tak jak robię to za pomocą CodedOutputStream?

Odpowiedz

1

Właśnie uświadomiłem sobie, że wystarczy owinąć się FileOutputStream w innym GZIPOutputStream jak ten:

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

i podczas czytania, tylko zrobić to samo:

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

Zamknij i ponownie plik do dołączenia wiadomości również działa poprawnie.

Powiązane problemy