Snappy是Google开源的压缩/解压缩库。和其他压缩库相比,snappy的压缩率并不是最高的,兼容性也并非最好的。相反,它的诞生旨在以极高的压缩/解压缩速率提供合理的压缩率。Snappy官指出:在64位单核core-i7处理器下,snappy的压缩率能够达到250MB/S,而解压缩速度则能达到500MB/S。目前很多软件使用(或支持)snappy作为压缩库,如MongoDB,Cassandra,Hadoop,Lucene…本文简单介绍snappy Java Api的使用。

Snappy提供了很多高级API以方便对byte[],Sting,double[]等进行压缩和解压缩,示例代码如下:

import org.xerial.snappy.Snappy;
String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of Snappy, a fast compresser/decompresser.";
{ byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));byte[] uncompressed = Snappy.uncompress(compressed);String result = new String(uncompressed, "UTF-8");System.out.println(result);
}{byte[] compressed = Snappy.compress(input);System.out.println(Snappy.uncompressString(compressed));
}{double [] arr = new double[]{123.456,234.567,345.678};byte[] compressed = Snappy.compress(arr);double [] unarr = Snappy.uncompressDoubleArray(compressed);System.out.println(Arrays.toString(unarr));
}

同时Snappy仍然保留着低级API,用于最小化内存的拷贝,例如

/*
*inputAddr:待压缩数据的内存地址
*inputSize:待压缩数据的byte size
*destAddr:压缩结果的保存地址
*return:返回压缩后数据的大小
*/
public static long rawCompress(long inputAddr,long inputSize, long destAddr)throws java.io.IOException;
/*
*inputAddr:待解压缩数据的内存地址
*inputSize:待解压缩数据的byte size
*destAddr:解压缩结果的保存地址
*return:返回解压缩后数据的大小
*/
public static long rawUncompress(long inputAddr,long inputSize,long destAddr)throws java.io.IOException;

基于输入/输出流的Snappy解压缩
SnappyOutputStream和SnappyInputStream分别用于流数据的压缩/解压缩。此外,从snappy v1.1.0开始提供了Framing-format(帧格式)输入输出流的压缩/解压缩的方法:SnappyFramedOutputStreamSnappyFramedInputStream。需要注意的是以SnappyOutputStream压缩的数据不能以SnappyFramedInputStream方法解开,反之亦然。下面以SnappyOutputStreamSnappyInputStream为例介绍。
SnappyOutputStream继承自java.io OutputStream,重写了常用的的write,close,flush:

File file = new File("..."); //待压缩文件
File out = new File("./", file.getName() + ".snappy"); //压缩结果文件byte[] buffer = new byte[1024 * 1024 * 8];
FileInputStream  fi = null;
FileOutputStream fo = null;
SnappyOutputStream sout = null;
try
{fi = new FileInputStream(file); fo = new FileOutputStream(out);sout = new SnappyOutputStream(fo);while(true){int count = fi.read(buffer, 0, buffer.length);if(count == -1) { break; }sout.write(buffer, 0, count);}sout.flush();
}
catch(Throwable ex)
{ex.printStackTrace();
}
finally
{if(sout != null) {try { sout.close();} catch (Exception e) {}}if(fi != null) { try { fi.close(); } catch(Exception x) {} }if(fo != null) { try { fo.close(); } catch(Exception x) {} }
}

SnappyInputStream 继承自java.io InputStream,重写了常用的read,close方法等

File file = new File("xxx"); //待解压文件
File out = new File("xxx");  //解压后文件byte[] buffer = new byte[1024 * 1024 * 8];
FileInputStream  fi = null;
FileOutputStream fo = null;
SnappyInputStream sin = null;
try
{fo = new FileOutputStream(out);fi = new FileInputStream(file.getPath());sin = new SnappyInputStream(fi);        while(true){int count = sin.read(buffer, 0, buffer.length);if(count == -1) { break; }fo.write(buffer, 0, count);}fo.flush();
}
catch(Throwable ex)
{ex.printStackTrace();
}
finally
{if(sin != null) { try { sin.close(); } catch(Exception x) {} }if(fi != null) { try { fi.close(); } catch(Exception x) {} }if(fo != null) { try { fo.close(); } catch(Exception x) {} }
}

Snappy Java API简介相关推荐

  1. HBASE的java api简介

    一:创建表 //获取配置 Configuration conf = new Configuration(); //填写配置信息 conf.set("hbase.zookeeper.quoru ...

  2. java编译器使用教程_Java编译器API简介

    今天给大家分享的是Java编译器API简介,文章部分内容摘自[优锐课]学习笔记. Java编译器API Java编译器API是Java模块(称为java.compiler)的一部分.该模块包括语言模型 ...

  3. 【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )

    文章目录 I Socket API 简介 II ServerSocket API 简介 III Socket 数据交互 IV Socket 客户端操作流程 V Socket 服务器端操作流程 VI S ...

  4. akka java api中文_akka入门 (1):akka简介

    这个akka入门系列大量参考了akka文档.主要是翻译+自己的一些理解.这里对akka文档吐一下槽,它的文档初看上去感觉挺详细的.但是很多示例代码都是片段,对初学者来说甚至都无法运行起来,所以我这里会 ...

  5. Hadoop-HDFS 简介以及配置和JAVA API操作

    Hadoop 一.概述 1.1 大数据概念 大数据是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力来适应海量.高增长率和多样化的信息资产.--来自研究机构Gartner 1.2 大数据面 ...

  6. java api 设计_Java API设计实践

    使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...

  7. hbase建索引java api_hbase java api样例(版本1.3.1,新API)

    hbase版本:1.3.1 目的:HBase新API的使用方法. 尝试并验证了如下几种java api的使用方法. 1.创建表 2.创建表(预分区) 3.单条插入 4.批量插入 5.批量插入(客户端缓 ...

  8. 【Netty】NIO 网络通信 SelectionKey 常用 API 简介

    文章目录 I . SelectionKey 简介 II . SelectionKey 事件简介 III . SelectionKey 常用 API 简介 I . SelectionKey 简介 1 . ...

  9. 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...

    简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...

最新文章

  1. mysqlorderby数字字符串排序_Python中的元组排序和深度比较
  2. ESX中的Linux热添加磁盘
  3. 自学python后能干什么-学Python后能干什么 郑州Python就业怎么样
  4. scala使用zip合并两个集合为二元组集合
  5. Eclipse for android 中设置java和xml代码提示功能(转)
  6. 怎么在QQ浏览器上使用微信聊天?
  7. Mysql查看某个表大小
  8. apache配置文件详解
  9. vue-awesome-swiper 的安装和使用
  10. [Vue] : vue-resource 实现 get, post, jsonp请求
  11. SVN删除文件及其恢复
  12. 一文看懂中国银联CUPS清结算流程
  13. 单片机c语言程序设计软件下载,《手把手教你学单片机C程序设计》PDF免费版下载...
  14. 树莓派爱好者基地64位系统1.0正式版说明及介绍
  15. 【机器学习】解释机器学习模型
  16. 【毫米波雷达】LFMCW测距/测速原理
  17. Power BI 中文版下载方式
  18. 树莓派开机启动python脚本的另一种方法
  19. HTMl+CSS 模仿京东网登录页面
  20. oracle 9i alert log,Oracle 9i,10g,11g各自alert日志的位置

热门文章

  1. 二部图(染色法判断二部图)
  2. Android音视频开发---0基础入门准备篇
  3. 模电_第二章_半导体二极管
  4. matlab之取余与取商
  5. 高斯过程回归的权空间观点推导及代码实现
  6. 大数据防疫全球化:以色列、伊朗等国使用网络追踪手段对抗疫情
  7. 带你沉浸式畅游电子海洋
  8. 有效打造你的个人品牌
  9. 【Nginx系列】- 初识Nginx
  10. Shell脚本故障诊断