Android总结之Gzip/Zip压缩
前言:
做过Android网络开发的都知道,在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方式,GZIP/ZIP压缩。
首先认识一下GZIP压缩
GZIP是网站压缩加速的一种技术,对于开启后可以加快我们网站的打开速度,原理是经过服务器压缩,客户端浏览器快速解压的原理,可以大大减少了网站的流量。GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的
开GZIP有什么好处?Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。
那么在Android上怎么实现压缩的呢?相关压缩api详见http://www.apihome.cn/api/android/java.util.zip
/**
* Gzip 压缩数据
*
* @param unGzipStr
* @return
*/
public static String compressForGzip(String unGzipStr) { if (TextUtils.isEmpty(unGzipStr)) {
return null;
}
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(baos);
gzip.write(unGzipStr.getBytes());
gzip.close();
byte[] encode = baos.toByteArray();
baos.flush();
baos.close();
return Base64Encoder.encode(encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return null;
} /**
* Gzip解压数据
*
* @param gzipStr
* @return
*/
public static String decompressForGzip(String gzipStr) {
if (TextUtils.isEmpty(gzipStr)) {
return null;
}
byte[] t = Base64Decoder.decodeToBytes(gzipStr);
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(t);
GZIPInputStream gzip = new GZIPInputStream(in);
byte[] buffer = new byte[BUFFERSIZE];
int n = 0;
while ((n = gzip.read(buffer, 0, buffer.length)) > 0) {
out.write(buffer, 0, n);
}
gzip.close();
in.close();
out.close();
return out.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
然后我们再来认识一下ZIP压缩
ZIP,是一个计算机文件的压缩的算法,原名Deflate(真空),发明者为菲尔·卡茨(Phil Katz)),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为 application/zip 。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7-Zip格式。从性能上比较,RAR格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。
看看具体实现:
/**
* Zip 压缩数据
*
* @param unZipStr
* @return
*/
public static String compressForZip(String unZipStr) { if (TextUtils.isEmpty(unZipStr)) {
return null;
}
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(baos);
zip.putNextEntry(new ZipEntry("0"));
zip.write(unZipStr.getBytes());
zip.closeEntry();
zip.close();
byte[] encode = baos.toByteArray();
baos.flush();
baos.close();
return Base64Encoder.encode(encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return null;
} /**
* Zip解压数据
*
* @param zipStr
* @return
*/
public static String decompressForZip(String zipStr) { if (TextUtils.isEmpty(zipStr)) {
return null;
}
byte[] t = Base64Decoder.decodeToBytes(zipStr);
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(t);
ZipInputStream zip = new ZipInputStream(in);
zip.getNextEntry();
byte[] buffer = new byte[BUFFERSIZE];
int n = 0;
while ((n = zip.read(buffer, 0, buffer.length)) > 0) {
out.write(buffer, 0, n);
}
zip.close();
in.close();
out.close();
return out.toString("UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
写个例子测试一下效果:
List<Person> personList = new ArrayList<>();
int testMaxCount = 500;//测试的最大数据条数
//添加测试数据
for (int i = 0; i < testMaxCount; i++) {
Person person = new Person();
person.setAge(i);
person.setName(String.valueOf(i));
personList.add(person);
}
//FastJson生成json数据
String jsonData = JsonUtils.objectToJsonForFastJson(personList);
Log.e("MainActivity", "压缩前json数据 ---->" + jsonData);
Log.e("MainActivity", "压缩前json数据长度 ---->" + jsonData.length()); //Gzip压缩
long start = System.currentTimeMillis();
String gzipStr = ZipUtils.compressForGzip(jsonData);
long end = System.currentTimeMillis();
Log.e("MainActivity", "Gzip压缩耗时 cost time---->" + (end - start));
Log.e("MainActivity", "Gzip压缩后json数据 ---->" + gzipStr);
Log.e("MainActivity", "Gzip压缩后json数据长度 ---->" + gzipStr.length()); //Gzip解压
start = System.currentTimeMillis();
String unGzipStr = ZipUtils.decompressForGzip(gzipStr);
end = System.currentTimeMillis();
Log.e("MainActivity", "Gzip解压耗时 cost time---->" + (end - start));
Log.e("MainActivity", "Gzip解压后json数据 ---->" + unGzipStr);
Log.e("MainActivity", "Gzip解压后json数据长度 ---->" + unGzipStr.length()); //Zip压缩
start = System.currentTimeMillis();
String zipStr = ZipUtils.compressForZip(jsonData);
end = System.currentTimeMillis();
Log.e("MainActivity", "Zip压缩耗时 cost time---->" + (end - start));
Log.e("MainActivity", "Zip压缩后json数据 ---->" + zipStr);
Log.e("MainActivity", "Zip压缩后json数据长度 ---->" + zipStr.length());
运行耗时对比:

数据压缩比对比:

从上面可以看出两者压缩效率和压缩比相差无几。可能我测试的数据比较小
接下来看下如何开启网络GZIP压缩
在android 客户端 request 头中加入 "Accept-Encoding", "gzip" ,来让服务器传送gzip 数据。
具体实现这这里不再做具体介绍分享一个链接:http://blog.csdn.net/kepoon/article/details/7482096
Android总结之Gzip/Zip压缩的更多相关文章
- Android安全开发之ZIP文件目录遍历
1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...
- 【VC++技术杂谈008】使用zlib解压zip压缩文件
最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...
- zip压缩命令的使用
file命令可以查看文件的类型 tar类型 .tar gzip类型 .gz bzip2类型 .bz2 zip类型 .zip 如果一个压缩文件由tar命令解压的前提,2个条件 1.这个文件 ...
- atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php 1. 压缩算法的归类::: 纯算法,带归档算法 1 2. zlib(适合字符串压缩) 1 3. gz ...
- RAR和ZIP:压缩大战真相
转:http://fqd2eh4y.blog.163.com/blog/static/69195855200801035015857 前言--王者归来? 等待足足两年之久,压缩霸主WinZip终于在万 ...
- Filter之——GZIP全站压缩
GZIP压缩:将压缩后的文本文件,发送给浏览器,减少流量. 一.进行gzip压缩条件: 1.请求头:Accept-Encoding : gzip 告诉服务器,该浏览器支持gzip压缩. 2.响应头: ...
- java基础---->Zip压缩的使用(转)
java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使 ...
- java工具类——java将一串数据按照gzip方式压缩和解压缩
我要整理在工作中用到的工具类分享出来,也方便自己以后查阅使用,这些工具类都是我自己实际工作中使用的 import java.io.ByteArrayInputStream; import java.i ...
- Android 安全开发之 ZIP 文件目录遍历
1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原 ...
随机推荐
- 踩石行动:ViewPager无限轮播的坑
2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...
- 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直 ...
- jq选择器基础
Jquery $代表选择器 使用jq必须要导入jq文件 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js&qu ...
- ABP文档翻译--值对象
本人是ABP初学者,在看英文文档和@tkb至简 的ABP框架理论研究总结(典藏版)时,发现大神@tkb至简中少了对Value Objects的翻译,看文档是新的,大神没时间把,小弟给补充上. 介绍 值 ...
- CSS margin详解
以下的分享是本人最近几天学习了margin知识后,大有启发,感觉以前对margin的了解简直太浅薄.所以写成以下文章,一是供自己整理思路:二是把知识分享出来,避免各位对margin属性的误解.内容可能 ...
- Android Socket连接PC出错问题及解决
最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.
- Android 算法 关于递归和二分法的小算法
// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...
- iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理
在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...
- Android中的多线程断点下载
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...
- Linux设备文件简介(转载)
Linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取).块设备(有缓冲且可以随机存取).每个字符设备和块设备都必须有主.次设备号,主设备号相同的设 备是同类设备(使用同一个驱动程序).这些设 ...