只接上干货,内容较干。文章大概需要花费5分钟简单了解下。
1、Gzip
直接看源码头文件如上图。压缩对象 GzipOutputStream ,通过函数操作可以看到整个文件流是比较完整并清晰。
因为它显示清晰包含了 从初始化 到 flush 到 close 的显示调用
2、Ostream
直接看源码头文件如上。流对象 OstreamOutputStream ,通过函数操作可以看到整个文件流很奇怪。奇怪在于它只有流函数,没有Flush。
为啥没有Flush呢?
听网友们的意思是:几年前流行面向对象 和 RAII,很多对象只能在析构函数中进行资源回收,Ostream 干了这个事…所以说需要加大括号使用局部变量来自动析构Flush,这样才能提前释放Ostream触发Flush成功写入
所以你的代码有bug吗?
std::ofstream output;
func()
{
/*
***
*/
{// 析构中自动flush
google::protobuf::io::OstreamOutputStream raw_output(&output);
google::protobuf::io::CodedOutputStream coded_output(&raw_output);
auto user_data = response->userdata();
int fid = (int)user_data;
coded_output.WriteVarint32(fid);
coded_output.WriteVarint32(response->ByteSizeLong());
response->SerializeToCodedStream(&coded_output);
}
}