boost::iostreams主要有两类东西组成,一个是device,另一个是filter,可以到源码目录下找,iostreams目录下有这两个目录可以找到相关类。

device像是一种设备,不能单独使用,要配合普通流stream或stream_buffer来使用,可将流中的数据输入/输出到这个设备上,可分为

Source,它以读取的方式访问字符序列,如:file_source 做文件输入。

Sink,它以写的方式访问字符序列,如:file_sink 做文件输出。

stream<file_source> 那么这个就是一个文件输入流,类似于ifilestream,而stream<file_sink>就是一个文件输出流,类似于ofilestream。

filter像一种过滤器,和device一样,也是不能单独使用的,要配合过滤流filtering_stream或filtering_streambuf来使用,将流中的数据按一种规则过滤,可分为:

InputFilter,过滤通过Source读取的输入,如:gzip_decompressor 按gzip算法解压流中的数据。
OutputFilter,过滤向Sink写入的输出,如:gzip_compressor 按gzip算法压缩流中的数据。

但filtering_stream是要维护一个filter的链表的,以device为结束。输出过滤流filtering_ostream,是按顺序执行filter,然后再输出到devic上,如:

压缩时

filtering_ostream out;
out.push(gzip_compressor()); //gzip OutputFilter

out.push(bzip2_compressor());//bzip2 OutputFilter
out.push(boost::iostreams::file_sink("test.txt"));//以file_sink device结束

这就会将流的数据先按gzip压缩,然后再按bzip2压缩之后,才输出到text.txt文件中。

解压时

filtering_istream in;
in.push(gzip_decompressor());/gzip InputFilter

in.push(bzip2_decompressor());/bzip2 InputFilter
in.push(file_source("test.txt"));

这时候先将test.txt文件中数据读出,然后按bzip2解压,然后再按gzip解压,存入in流中,正好是压缩的逆序。

要使用zlib压缩,首先需要通过boost编译zlib。

[plain] view plain copy print ?
  1. 1下载zlib(http://www.zlib.net/)
  2. 2,设置 zlib的路径(进入 dos 界面)
  3. set  ZLIB_SOURCE=" E:/zlib-1.2.8"
  4. 3编译
  5. bjam --toolset=msvc-9.0 --with-iostreams --build-type=complete
  6. 注:zlib不需要提前编译

附实现代码

[cpp] view plain copy print ?
  1. #include <boost/iostreams/filtering_stream.hpp>
  2. #include <boost/iostreams/copy.hpp>
  3. #include <boost/iostreams/filter/zlib.hpp>
  4. #include <boost/iostreams/device/file_descriptor.hpp>
  5. #include <boost/iostreams/device/file.hpp>
  6. #include <iostream>
  7. #include <sstream>
  8. int main()
  9. {
  10. try{
  11. std::stringstream ss_comp;
  12. boost::iostreams::filtering_ostream out;
  13. out.push(boost::iostreams::zlib_compressor());
  14. //out.push(ss_comp);    //压缩到字符流中
  15. out.push(boost::iostreams::file_sink("test.txt"));      //压缩到文件中
  16. boost::iostreams::copy(std::stringstream("hello"), out);
  17. std::cout << "compressor data:" << ss_comp.str() << std::endl;
  18. std::stringstream ss_decomp;
  19. boost::iostreams::filtering_istream in;
  20. in.push(boost::iostreams::zlib_decompressor());
  21. //in.push(ss_comp);     //从字符流中解压
  22. in.push(boost::iostreams::file_source("test.txt"));     //从文件中解压
  23. boost::iostreams::copy(in, ss_decomp);
  24. std::cout << "decompressor data:" << ss_decomp.str() << std::endl;
  25. }
  26. catch(std::exception& e)
  27. {
  28. std::cout << "exception:" << e.what() << std::endl;
  29. }
  30. catch(...)
  31. {
  32. std::cout << "unknown exception." << std::endl;
  33. }
  34. system("pause");
  35. return 0;
  36. }

针对解压buffer,gzip为如下代码
            std::stringstream ss_decomp;
            std::string result_str;
            boost::iostreams::filtering_istream in;  
            in.push(boost::iostreams::gzip_decompressor());  
            //in.push(ss_comp);     //从字符流中解压  
            in.push(boost::iostreams::array_source(buffer,size));     //从文件中解压  
            boost::iostreams::copy(in, ss_decomp);  
            result_str = ss_decomp.str();

boost 处理压缩解压缩相关推荐

  1. asp.net利用RAR实现文件压缩解压缩【月儿原创】

    asp.net利用RAR实现文件压缩解压缩 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.6.13 如果服务器上安装了RAR程 ...

  2. linux xz 解压initrd.img,2016-8-28 linux基础学习——压缩解压缩及归档 while脚本

    文件管理命令----压缩解压缩及归档基本工具 压缩.解压缩命令 压缩格式:gz, bz2, xz, zip, Z 压缩算法:算法不同,压缩比也会不同: 早期 压缩: compress(压缩比很小): ...

  3. linux如何查看归档文件,linux基本命令:文本搜索,拷贝文件,移动文件,归档管理,压缩解压缩文件,查看命令位置...

    1.文本搜索:grep grep查找的是文件内容中的文本,字符需要用引号括起来,单引双引都可以 格式:grep [-选项] '内容' 文件名 例如: -v显示不包含匹配文本的所有行(相当于求反) -n ...

  4. Linux压缩解压缩文章总结

    Linux中zip压缩和unzip解压缩命令详解 这篇文章主要介绍了zip/unzip压缩解压缩命令的使用方法及参数的说明 1.把/home目录下面的mydata目录压缩为mydata.zip zip ...

  5. Linux运维:常用的压缩解压缩命令(zip、tar)

    文章目录 压缩类型 zip类型 1.zip压缩 2.unzip解压缩 tar类型 1..tar压缩和解压 2..tar.gz压缩和解压 3..tar.bz2压缩和解压 4..tar.Z压缩和解压 5. ...

  6. Linux常用命令(第二版) --压缩解压缩命令

    压缩解压缩命令: ----------.gz---------- 1.压缩 gzip[GNU zip]: /bin/gzip 格式: gzip 选项 [文件] #压缩文件,压缩后扩展名为.gz,Lin ...

  7. 详解Linux的压缩解压缩命令

    1.性能稍差的两种压缩方式        gzip压缩        bzip2压缩 2.tar压缩 3.rar压缩 4.zip压缩 1. 性能稍差的两种压缩方式 1.1gzip压缩 1.gzip [ ...

  8. Linux压缩解压缩命令

    2019独角兽企业重金招聘Python工程师标准>>> 压缩文件可以为磁盘节省不少空间,那么Linux系统的压缩和解压缩命令都有哪些呢?下面小编就给大家介绍下Linux压缩和解压缩的 ...

  9. tar压缩解压缩命令详解

    tar压缩解压缩命令详解 tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个, ...

最新文章

  1. 进程初识和multiprocessing模块之Process
  2. Spring Boot 五种热部署方式,再也不用老重启了!
  3. Git从现有仓库新建干净版本(清除版本commit记录)
  4. Scala深入浅出实战初级入门经典视频课程
  5. vc red.msi matlab,vc red.msi x64+x32位版下载
  6. 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
  7. python读文件的方法open,file,with open
  8. java hl7v3_HL7标准V3开发框架中个模型的关系
  9. SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO
  10. 考研要求过英语四六级!这些大学有明确规定!
  11. 中科大少年班,阿里云首席科学家闵万里离职,发内部信告别!
  12. asp.net core 日志中间件(LoggerMiddleware)
  13. 等价多米诺骨牌对的数量
  14. 奇门遁甲排盘方:定局
  15. 手机号码清洗的优势是什么
  16. python语音识别(语音转文字)
  17. android 儿童 汉字 学习 游戏,儿童学汉字游戏app
  18. 不会搭建Android知识框架,活该你成不了技术大牛!
  19. 奔图M9006DN复印机显示代码service error 191.10 engine error
  20. python井字棋_python实现井字棋小游戏

热门文章

  1. 大气颗粒物PMF源解析实用干货
  2. uni-app h5唤起App
  3. MOS管 电源防反接
  4. c语言eof不起作用,c语言中EOF的用法
  5. 轻松三步教你配置oracle,oracle home 配置
  6. rstp使用linux运行,RSTP 详细
  7. 推荐一款免安装的在线Visio流程工具ProcessOn
  8. 欢能和南卡电容笔哪款好用?国内主动式电容笔对比
  9. Python实现条形码生成
  10. 在计算机软件中 BIOS的中文意思是,电脑BIOS中各选项的含义