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

时间: 2024-10-02 05:37:30

Android之Gzip/Zip压缩的相关文章

gzip,zip,bzip2,xz,tar文件压缩和归档

gzip [-d#] 文件   其中#为1-9的数字 gzip + 文件  压缩文件,删除源文件 gzip -d + 文件  解压缩文件,删除源文件 压缩等级:1压缩最差,9压缩最好,6为默认 zcat查看.gz的文本文件内容 bzip2 + 文件  压缩文件,删除源文件 bzip2 -d + 文件  解压缩文件,删除源文件 bzcat查看.bz2的文本文件内容 gzip和bzip2都不能压缩目录 zip和unzip zip  + 压缩后文件名.zip + 文件      压缩文件,源文件不会消

java基础----&gt;Zip压缩的使用(转)

java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使用 GZIP与ZIP压缩的比较 友情链接 关于压缩的简要说明 一. Java中有着压缩的类: CheckedInputStream GetCheckSum()为任何InputStream 产生校验和(不仅是解压) CheckedOutputStream GetCheckSum()为任何OutputS

atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php

atitit.压缩算法 ZLib ,gzip ,zip   最佳实践  java .net php 1. 压缩算法的归类::: 纯算法,带归档算法 1 2. zlib(适合字符串压缩) 1 3. gzip( 适合单个的文件) 1 4. zip 2 5. java jdk 给zlib,gzip,zip的支持 2 6. zlib---gzip 压缩在后长度比较 2 7. 别的bzip,,tar 2 8. 参考 3 1. 压缩算法的归类::: 纯算法,带归档算法 ZIP.RAR等归档算法 ZLib可以

javaEE之------GZIP全站压缩

GZIP全站压缩 将压缩后的文本文件,发送给浏览器,减少流量 GZIP压缩的条件: 设置头文件协议: myresp.setHeader("Content-Encoding", "gzip"); myresp.setContentLength(src.length); 两个主要的类:ByteArrayOutputStream,GZIPOutputStream 采用包装模式对respone加强 主要流程: 共存在两种流,字节流outputStream和字符流PrintW

tar&amp;&amp;gzip&amp;&amp;zip

//参考< Linux Shell 脚本攻略 第二版> tar命令中的-c 代表"create file" tar命令中的-f 代表"specify filename".(文件名必须紧跟在-f之后,而且-f应该是选项中的最后一个) 1,用tar对文件进行归档: [email protected]:~$ tar -cf all.tar all all~ [email protected]:~$ 2,使用-t选项查看归档文件中所包含的文件: [email p

AntZipUtils【基于Ant的Zip压缩解压缩工具类】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 Android 压缩解压zip文件一般分为两种方式: 基于JDK的Zip压缩工具类 该版本存在问题:压缩时如果目录或文件名含有中文,压缩后会变成乱码: 使用Java的zip包可以进行简单的文件压缩和解压缩处理时,但是遇到包含中文汉字目录或者包含多层子目录的复杂目录结构时,容易出现各种各样的问题. 基于Ant的Zip压缩工具类 需要第三方JAR包:Apache的ant.jar: 解决了上面存在的问题. 效果图 代码分析 常用的方法: 压缩

Java压缩技术(二) ZIP压缩——Java原生实现

原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZIP的java原生实现. 看了几篇zip压缩算法的帖子,讲的算是比较细致了,但就是没有对应的解压缩实现,太惜败了! 我就喜欢没事做总结,稍作整理,将其收纳! 相关链接: Java压缩技术(一) ZLib Java压缩技术(二) ZIP压缩——Java原生实现 Java压缩技术(三) ZIP解压缩——J

Android中的Zip解压缩

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStrea

Java解压缩技术(一)ZIP压缩-解压缩

Java解压缩技术的实现 GZIP ZIP BZIP2系列实现 没啥好说的,都是些文件操作,直接贴代码 package com.ljh.zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import j