Java压缩技术(一) ZLib

转载自  Java压缩技术(一) ZLib

有关ZLib可参见官方主页 http://www.zlib.net/ 
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。 

压缩工具代码如下: 

Java代码 
  1. /** 
  2.  * 2009-9-9 
  3.  */  
  4. package org.zlex.commons.io;  
  5.   
  6. import java.io.ByteArrayOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStream;  
  10. import java.util.zip.Deflater;  
  11. import java.util.zip.DeflaterOutputStream;  
  12. import java.util.zip.Inflater;  
  13. import java.util.zip.InflaterInputStream;  
  14.   
  15. /** 
  16.  * ZLib压缩工具 
  17.  *  
  18.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 
  19.  * @version 1.0 
  20.  * @since 1.0 
  21.  */  
  22. public abstract class ZLibUtils {  
  23.   
  24.     /** 
  25.      * 压缩 
  26.      *  
  27.      * @param data 
  28.      *            待压缩数据 
  29.      * @return byte[] 压缩后的数据 
  30.      */  
  31.     public static byte[] compress(byte[] data) {  
  32.         byte[] output = new byte[0];  
  33.   
  34.         Deflater compresser = new Deflater();  
  35.   
  36.         compresser.reset();  
  37.         compresser.setInput(data);  
  38.         compresser.finish();  
  39.         ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);  
  40.         try {  
  41.             byte[] buf = new byte[1024];  
  42.             while (!compresser.finished()) {  
  43.                 int i = compresser.deflate(buf);  
  44.                 bos.write(buf, 0, i);  
  45.             }  
  46.             output = bos.toByteArray();  
  47.         } catch (Exception e) {  
  48.             output = data;  
  49.             e.printStackTrace();  
  50.         } finally {  
  51.             try {  
  52.                 bos.close();  
  53.             } catch (IOException e) {  
  54.                 e.printStackTrace();  
  55.             }  
  56.         }  
  57.         compresser.end();  
  58.         return output;  
  59.     }  
  60.   
  61.     /** 
  62.      * 压缩 
  63.      *  
  64.      * @param data 
  65.      *            待压缩数据 
  66.      *  
  67.      * @param os 
  68.      *            输出流 
  69.      */  
  70.     public static void compress(byte[] data, OutputStream os) {  
  71.         DeflaterOutputStream dos = new DeflaterOutputStream(os);  
  72.   
  73.         try {  
  74.             dos.write(data, 0, data.length);  
  75.   
  76.             dos.finish();  
  77.   
  78.             dos.flush();  
  79.         } catch (IOException e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.     }  
  83.   
  84.     /** 
  85.      * 解压缩 
  86.      *  
  87.      * @param data 
  88.      *            待压缩的数据 
  89.      * @return byte[] 解压缩后的数据 
  90.      */  
  91.     public static byte[] decompress(byte[] data) {  
  92.         byte[] output = new byte[0];  
  93.   
  94.         Inflater decompresser = new Inflater();  
  95.         decompresser.reset();  
  96.         decompresser.setInput(data);  
  97.   
  98.         ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);  
  99.         try {  
  100.             byte[] buf = new byte[1024];  
  101.             while (!decompresser.finished()) {  
  102.                 int i = decompresser.inflate(buf);  
  103.                 o.write(buf, 0, i);  
  104.             }  
  105.             output = o.toByteArray();  
  106.         } catch (Exception e) {  
  107.             output = data;  
  108.             e.printStackTrace();  
  109.         } finally {  
  110.             try {  
  111.                 o.close();  
  112.             } catch (IOException e) {  
  113.                 e.printStackTrace();  
  114.             }  
  115.         }  
  116.   
  117.         decompresser.end();  
  118.         return output;  
  119.     }  
  120.   
  121.     /** 
  122.      * 解压缩 
  123.      *  
  124.      * @param is 
  125.      *            输入流 
  126.      * @return byte[] 解压缩后的数据 
  127.      */  
  128.     public static byte[] decompress(InputStream is) {  
  129.         InflaterInputStream iis = new InflaterInputStream(is);  
  130.         ByteArrayOutputStream o = new ByteArrayOutputStream(1024);  
  131.         try {  
  132.             int i = 1024;  
  133.             byte[] buf = new byte[i];  
  134.   
  135.             while ((i = iis.read(buf, 0, i)) > 0) {  
  136.                 o.write(buf, 0, i);  
  137.             }  
  138.   
  139.         } catch (IOException e) {  
  140.             e.printStackTrace();  
  141.         }  
  142.         return o.toByteArray();  
  143.     }  
  144. }  

测试用例代码如下: 
Java代码 
  1. /** 
  2.  * 2009-9-9 
  3.  */  
  4. package org.zlex.commons.io;  
  5.   
  6. import static org.junit.Assert.*;  
  7.   
  8. import java.io.File;  
  9. import java.io.FileInputStream;  
  10. import java.io.FileOutputStream;  
  11.   
  12. import org.junit.Test;  
  13.   
  14. /** 
  15.  * ZLib压缩测试用例 
  16.  *  
  17.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 
  18.  * @version 1.0 
  19.  * @since 1.0 
  20.  */  
  21. public class ZLibUtilsTest {  
  22.   
  23.     @Test  
  24.     public final void testBytes() {  
  25.         System.err.println("字节压缩/解压缩测试");  
  26.         String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";  
  27.         System.err.println("输入字符串:\t" + inputStr);  
  28.         byte[] input = inputStr.getBytes();  
  29.         System.err.println("输入字节长度:\t" + input.length);  
  30.   
  31.         byte[] data = ZLibUtils.compress(input);  
  32.         System.err.println("压缩后字节长度:\t" + data.length);  
  33.   
  34.         byte[] output = ZLibUtils.decompress(data);  
  35.         System.err.println("解压缩后字节长度:\t" + output.length);  
  36.         String outputStr = new String(output);  
  37.         System.err.println("输出字符串:\t" + outputStr);  
  38.   
  39.         assertEquals(inputStr, outputStr);  
  40.     }  
  41.   
  42.     @Test  
  43.     public final void testFile() {  
  44.         String filename = "zlib";  
  45.         File file = new File(filename);  
  46.         System.err.println("文件压缩/解压缩测试");  
  47.         String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";  
  48.         System.err.println("输入字符串:\t" + inputStr);  
  49.         byte[] input = inputStr.getBytes();  
  50.         System.err.println("输入字节长度:\t" + input.length);  
  51.   
  52.         try {  
  53.   
  54.             FileOutputStream fos = new FileOutputStream(file);  
  55.             ZLibUtils.compress(input, fos);  
  56.             fos.close();  
  57.             System.err.println("压缩后字节长度:\t" + file.length());  
  58.         } catch (Exception e) {  
  59.             fail(e.getMessage());  
  60.         }  
  61.   
  62.         byte[] output = null;  
  63.   
  64.         try {  
  65.             FileInputStream fis = new FileInputStream(file);  
  66.             output = ZLibUtils.decompress(fis);  
  67.             fis.close();  
  68.   
  69.         } catch (Exception e) {  
  70.             fail(e.getMessage());  
  71.         }  
  72.         System.err.println("解压缩后字节长度:\t" + output.length);  
  73.         String outputStr = new String(output);  
  74.         System.err.println("输出字符串:\t" + outputStr);  
  75.   
  76.         assertEquals(inputStr, outputStr);  
  77.     }  
  78. }  

输入结果 
Consloe代码  
  1. 字节压缩/解压缩测试  
  2. 输入字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  
  3. 输入字节长度: 59  
  4. 压缩后字节长度:    39  
  5. 解压缩后字节长度:   59  
  6. 输出字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  
  7. 文件压缩/解压缩测试  
  8. 输入字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  
  9. 输入字节长度: 59  
  10. 压缩后字节长度:    39  
  11. 解压缩后字节长度:   59  
  12. 输出字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  

应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率! 
ZLib压缩对大字节数据压缩,才能反映出压缩效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【送书活动】机器学习项目开发实战

出版时间 2016-08-01 定价&#xff1a;59元 作者&#xff1a; Mathias Brandewinder是Microsoft F# 最有价值专家&#xff08;MVP&#xff09;&#xff0c;住在加州旧金山&#xff0c;在那里他为Clear Lines Consulting工作。作为一名当之无愧的数学极客&#xff0c;他很早就对…

刀剑斗神传只显示11个服务器,与官方服务器互通 《刀剑斗神传》电脑版即将上线...

乱世江湖动作MMO手游《刀剑斗神传》将于12月29日开启公测&#xff0c;为方便玩家更好的体验游戏&#xff0c;游戏将推出电脑版&#xff0c;并与iOS、安卓的官方服务器实现数据互通。不管是在公交地铁上用手机&#xff0c;还是在自己温馨的小居室用电脑&#xff0c;你可以选择自…

深入wepy源码:wpy文件编译过程

转载自 深入wepy源码&#xff1a;wpy文件编译过程wepy 是腾讯开源的一款小程序框架&#xff0c;主要通过预编译的手段&#xff0c;让开发者采用类 Vue 风格开发。 让我们一起看看&#xff0c; wepy 是如何实现预编译的。先放上一张官网的流程图&#xff0c;后面的分析可以参考该…

sql事务、视图和索引

一、事务&#xff1a;1.概念&#xff1a;是单个逻辑单元执行的一系列操作&#xff08;一个事务中有多个sql语句&#xff09;&#xff0c;这个操作作为一个整体一起提交&#xff0c;要么执行&#xff0c;要么都不执行&#xff0c;多个事务操作是一个不可分割的逻辑单元。2.事务的…

qq空间说说服务器维护,如何解决QQ空间说说发表不了

如何解决QQ空间说说发表不了我的今天也是这种情况几个qq都发表不了&#xff0c;都不知道怎么办了&#xff0c;然后过一会儿又能发表了但是现在有发表不了了...是空间的系统问题吧&#xff01;还有啊就是不要加什么敏感词汇不然也发表不了一、如果您打开是提示“服务器忙&#x…

Win10上运行Docker

1. 前言 Docker最近推出了可以运行在Win10和Mac上的稳定版本&#xff0c;让我们赶紧来体验一下。 Docker发布Mac和Windows 的目标非常简单——开发者可以更加简单方便地在研发机器上使用Docker。下面是此次版本所改进的地方&#xff1a; 更快更可靠——在本地开发环境上&#x…

sql serve存储过程

存储过程一.概念:预先编译好的sql程序&#xff0c;可以包含&#xff1a;操作数据、变量、控制语句&#xff0c;增删改查操作都可以&#xff0c;存储过程是保存在数据库中 的一个对象。二.好处&#xff1a;1.安全性更高2.减少了网络流量3.提高速度&#xff0c;性能更高4.模…

JAVA数据库连接池实现

转载自 JAVA数据库连接池实现连接池的管理用了了享元模式&#xff0c;这里对连接池进行简单设计。 一、设计思路1.连接池配置属性DBbean&#xff1a;里面存放可以配置的一些属性2.连接池接口IConnectionPool&#xff1a;里面定义一些基本的获取连接的一些方法3.接口实现Conne…

在.NET开发面向Oracle数据库的应用程序

其实这个不是一个什么新的话题。但是之前在多次项目中&#xff0c;总是遇到大家针对Oracle数据库的访问时&#xff0c;会有各种各样的问题&#xff0c;最基本的就是要在客户端安装各种client&#xff0c;版本不一样的话还有各种问题。 静下心来看看&#xff0c;其实也没有那么难…

服务器ubuntu系统版本选型原则,系统集成 - 选择Ubuntu服务器版操作系统的六大理由_服务器应用_Linux公社-Linux系统门户网站...

二. 系统集成(1)集成现有的系统Ubuntu服务器版本用常用的身份认证方式和服务入口工具简单地集成企业现有的客户/服务器结构。我们都知道系统集成技术的重要性&#xff0c;这也是Ubuntu团队花费大量时间研究如何实现服务器与基础设施简单融合的原因。(2)简单的验证方式验证功能对…

sql serve基础

一、数据库登录名与数据库用户1.登录名登录服务器2.数据库用户访问具体数据库二者要建立映射关系二、数据库文件&#xff1a;1.主数据文件&#xff1a;*.mdf&#xff08;必须&#xff09;2.辅助数据文件&#xff1a;*.ndf(可选)3.日志文件&#xff1a;*.ldf&#xff08;必须&am…

sql基本操作语句

sql: 结构化查询语言T-SQL:sql server数据库中用的查询语言数据库对象操作&#xff1a;一、建库&#xff1a;二、建表&#xff1a;三、数据操作1.添加INSERT [INTO] 表名 (列列表) VALUES(值列表)a. 列列表和值列表一一对应&#xff08;顺序和个数&#xff09;b。可以为null的…

云服务器mqtt协议,云服务器mqtt协议

云服务器mqtt协议 内容精选换一换IPv6的使用&#xff0c;可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4&#xff0c;那么启用IPv6后&#xff0c;云服务器可在双栈模式下运行&#xff0c;即云服务器可以拥有两个不同版本的IP地址&#xff1a;IPv4地址和IPv…

常用的推荐算法解析

转载自 常用的推荐算法解析1. 前言随着互联网技术和社会化网络的发展&#xff0c;每天有大量包括博客&#xff0c;图片&#xff0c;视频&#xff0c;微博等等的信息发布到网上。传统的搜索技术已经不能满足用户对信息发现的需求&#xff0c;原因有多种&#xff0c;可能是用户…

一步一步封装自己的HtmlHelper组件:BootstrapHelper

前言&#xff1a;之前学习过很多的Bootstrap组件&#xff0c;博主就在脑海里构思&#xff1a;是否可以封装一套自己Bootstrap组件库呢。再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式&#xff0c;于是打算仿照HtmlHelper封装一套BootstrapHelper&#xff0c…

sql server简单查询

一、插入多行数据&#xff1a;1.insert into 。。。 select 从一个表中取出数据插入另一个已存在的表2.select into 从一个表中取出数据插入一个新表中3.insert into ()unionselect 常量列表 二、简单查询1. 查询所有行和列 SELECT * FROM 表名2.查询部分列 SELECT 列列…

推荐系统常用的推荐算法

转载自 推荐系统常用的推荐算法 一、推荐系统概述和常用评价指标1.1 推荐系统的特点 在知乎搜了一下推荐系统&#xff0c;果真结果比较少&#xff0c;显得小众一些&#xff0c;然后大家对推荐系统普遍的观点是&#xff1a; (1)重要性UI>数据>算法&#xff0c;就是推荐系…

拥抱.NET Core,学习.NET Core的基础知识补遗

前言 .NET Core的新特性之一就是跨平台&#xff0c;但由于对之前框架的兼容导致编写一个.NET Core类库变得相当复杂&#xff0c;主要体现为相当多的框架目标和支持平台&#xff0c;今天我们就对.NET Core的跨平台特性进行一次梳理。 在.NET Core之前 其实早在.NET Core之前微软…

sql server模糊查询、分组

一、系统函数1。convert&#xff08;类型[length] &#xff0c;表达式[&#xff0c;样式]&#xff09;2.isnull&#xff08;表达式&#xff0c;默认值&#xff09;字符函数&#xff1a;len() 长度ltrim&#xff08;&#xff09;|rtrim&#xff08;&#xff09;去除左右空格righ…

拥抱.NET Core,如何开发一个跨平台类库

在此前的文章中详细介绍了使用.NET Core的基本知识&#xff0c;如果还没有看&#xff0c;可以先去了解“拥抱.NET Core&#xff0c;学习.NET Core的基础知识补遗”&#xff0c;以便接下来的阅读。 在本文将介绍如何配置类库项目支持不同的平台&#xff0c;并为不同的平台进行兼…