Java压缩技术(一) ZLib
原文:http://snowolf.iteye.com/blog/465433
有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。
压缩工具代码如下:
- /**
- * 2009-9-9
- */
- package org.zlex.commons.io;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.zip.Deflater;
- import java.util.zip.DeflaterOutputStream;
- import java.util.zip.Inflater;
- import java.util.zip.InflaterInputStream;
- /**
- * ZLib压缩工具
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- public abstract class ZLibUtils {
- /**
- * 压缩
- *
- * @param data
- * 待压缩数据
- * @return byte[] 压缩后的数据
- */
- public static byte[] compress(byte[] data) {
- byte[] output = new byte[0];
- Deflater compresser = new Deflater();
- compresser.reset();
- compresser.setInput(data);
- compresser.finish();
- ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
- try {
- byte[] buf = new byte[1024];
- while (!compresser.finished()) {
- int i = compresser.deflate(buf);
- bos.write(buf, 0, i);
- }
- output = bos.toByteArray();
- } catch (Exception e) {
- output = data;
- e.printStackTrace();
- } finally {
- try {
- bos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- compresser.end();
- return output;
- }
- /**
- * 压缩
- *
- * @param data
- * 待压缩数据
- *
- * @param os
- * 输出流
- */
- public static void compress(byte[] data, OutputStream os) {
- DeflaterOutputStream dos = new DeflaterOutputStream(os);
- try {
- dos.write(data, 0, data.length);
- dos.finish();
- dos.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 解压缩
- *
- * @param data
- * 待压缩的数据
- * @return byte[] 解压缩后的数据
- */
- public static byte[] decompress(byte[] data) {
- byte[] output = new byte[0];
- Inflater decompresser = new Inflater();
- decompresser.reset();
- decompresser.setInput(data);
- ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
- try {
- byte[] buf = new byte[1024];
- while (!decompresser.finished()) {
- int i = decompresser.inflate(buf);
- o.write(buf, 0, i);
- }
- output = o.toByteArray();
- } catch (Exception e) {
- output = data;
- e.printStackTrace();
- } finally {
- try {
- o.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- decompresser.end();
- return output;
- }
- /**
- * 解压缩
- *
- * @param is
- * 输入流
- * @return byte[] 解压缩后的数据
- */
- public static byte[] decompress(InputStream is) {
- InflaterInputStream iis = new InflaterInputStream(is);
- ByteArrayOutputStream o = new ByteArrayOutputStream(1024);
- try {
- int i = 1024;
- byte[] buf = new byte[i];
- while ((i = iis.read(buf, 0, i)) > 0) {
- o.write(buf, 0, i);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return o.toByteArray();
- }
- }
测试用例代码如下:
- /**
- * 2009-9-9
- */
- package org.zlex.commons.io;
- import static org.junit.Assert.*;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import org.junit.Test;
- /**
- * ZLib压缩测试用例
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- public class ZLibUtilsTest {
- @Test
- public final void testBytes() {
- System.err.println("字节压缩/解压缩测试");
- String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";
- System.err.println("输入字符串:\t" + inputStr);
- byte[] input = inputStr.getBytes();
- System.err.println("输入字节长度:\t" + input.length);
- byte[] data = ZLibUtils.compress(input);
- System.err.println("压缩后字节长度:\t" + data.length);
- byte[] output = ZLibUtils.decompress(data);
- System.err.println("解压缩后字节长度:\t" + output.length);
- String outputStr = new String(output);
- System.err.println("输出字符串:\t" + outputStr);
- assertEquals(inputStr, outputStr);
- }
- @Test
- public final void testFile() {
- String filename = "zlib";
- File file = new File(filename);
- System.err.println("文件压缩/解压缩测试");
- String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";
- System.err.println("输入字符串:\t" + inputStr);
- byte[] input = inputStr.getBytes();
- System.err.println("输入字节长度:\t" + input.length);
- try {
- FileOutputStream fos = new FileOutputStream(file);
- ZLibUtils.compress(input, fos);
- fos.close();
- System.err.println("压缩后字节长度:\t" + file.length());
- } catch (Exception e) {
- fail(e.getMessage());
- }
- byte[] output = null;
- try {
- FileInputStream fis = new FileInputStream(file);
- output = ZLibUtils.decompress(fis);
- fis.close();
- } catch (Exception e) {
- fail(e.getMessage());
- }
- System.err.println("解压缩后字节长度:\t" + output.length);
- String outputStr = new String(output);
- System.err.println("输出字符串:\t" + outputStr);
- assertEquals(inputStr, outputStr);
- }
- }
输入结果
- 字节压缩/解压缩测试
- 输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
- 输入字节长度: 59
- 压缩后字节长度: 39
- 解压缩后字节长度: 59
- 输出字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
- 文件压缩/解压缩测试
- 输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
- 输入字节长度: 59
- 压缩后字节长度: 39
- 解压缩后字节长度: 59
- 输出字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率!
ZLib压缩对大字节数据压缩,才能反映出压缩效果。![]()
先占个位儿,回头细致整理!![]()
Java压缩技术(一) ZLib的更多相关文章
- Java压缩技术(二) ZIP压缩——Java原生实现
原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZI ...
- Java压缩技术的学习
由于工作的需要,经常要手动去打上线安装包,为了方便,自己写程序去帮助打包.使用过Unix或者Linux的人都基本上都用过tar打包以及gzip压缩,但在Windows下使用得最多的压缩还是RAR和Zi ...
- java 压缩技术
package zip; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStr ...
- Java压缩技术(三) ZIP解压缩——Java原生实现
原文:http://snowolf.iteye.com/blog/642492 JavaEye的朋友跟我说:“你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读”.ok,面向读 ...
- Java后端实现图片压缩技术
今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...
- (转)java缓存技术,记录
http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇 ...
- 深入分析Java Web技术内幕(修订版)
阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著 ISBN 978-7-121- ...
- JAVA缓存技术之EhCache
最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/ar ...
- 转:关于数据库压缩技术的Survey
原文来自于:http://outofmemory.cn/mysql/database-compression-tech 昨天给团队内的小伙伴做了一个关于数据库压缩技术的Survey,现将其中可以公开的 ...
随机推荐
- kickstart配置文件详解和system-config-kickstart (转载)
kickstart是什么 许多系统管理员宁愿使用自动化的安装方法来安装红帽企业 Linux.为了满足这种需要,红帽创建了kickstart安装方法.使用kickstart,系统管理员可以 ...
- Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
Power Designer逆向操作(从mysql5.0生成数据库的物理模型) 环境:powderdesigner12.5:mysql5.0 步骤: 1. 为指定的数据库配置MySQL的ODBC数据 ...
- codeforces_738D
D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 零基础到精通Linux,从这篇文章开始
2018年想做Linux运维的人应该如何学习才能快速精通Linux? Linux入门这么简单,为什么很多人学不会? 想要成为一个合格的运维工程师,到底怎么才能从零开始精通Linux? 作为一个运维小白 ...
- Luogu P1187 3D模型
题目描述 一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成.在每个网格上都可以有一个建筑,建筑由若干个1×1×1的立方体搭建而成(也就是所有建筑的底部都在同一平面上的).几个典型的城市模 ...
- Luogu P2922 秘密消息
原题 P2922 [USACO08DEC]秘密消息Secret Message 题目描述 Bessie is leading the cows in an attempt to escape! To ...
- PHP基础库及扩展库安装
一.安装PHP所需的lib库(基础库): 1.yum install zlib-devel libxml2-devel libjpey-devel libjpeg-turbo-devel libico ...
- raspberry 重新烧录后的设置
raspberry初学者在使用的时候经常遇到各种问题,常常重新烧录系统,现在把新系统的常用配置和安装内容整理一下,避免自己忘记 1.安装常用软件包: sudo apt-get gedit sudo a ...
- linux中文man手册安装
1.下载源码 源码网址 https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/ 下载源码 wget https://src.fedorapro ...
- CentOS与FreeBSD环境下安装filebeat
业务服务器CentOS与FreeBSD共存(痛苦囧...) CentOS rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch ...