2012-12-07 28 views
6

मैं प्रोटोकॉल बफ़र्स 'CodedOutputStream और FileOutputStream उपयोग कर रहा हूँ इस तरह एक फ़ाइल में अनुक्रम में एक से अधिक संदेशों को क्रमानुसार करने:एक अनुक्रमित संपीड़ित फ़ाइल में एकाधिक प्रोटोकॉल बफर के संदेशों को कैसे लिखें?

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

कैसे मैं एक GzipOutputStream का उपयोग कर एक ही कर सकते हैं? क्या एक gzip संपीड़ित फ़ाइल को नए संदेशों को जोड़ने के लिए फिर से खोल दिया जा सकता है जैसे कि मैं कोडेडऑटपुटस्ट्रीम का उपयोग करता हूं?

उत्तर

1

मैं सिर्फ महसूस किया है कि मैं सिर्फ इस तरह एक और GzipOutputStream में FileOutputStream रैप करने के लिए की जरूरत है:

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

और जब पढ़ने के लिए, बस एक ही है:

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

बंद और फिर से खोलना संदेश जोड़ने के लिए फ़ाइल भी ठीक काम करता है।