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?