Java压缩技术(一) ZLib
2016-06-11 11:55
253 查看
原文:http://snowolf.iteye.com/blog/465433
有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。
压缩工具代码如下:
Java代码
/**
* 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();
}
}
测试用例代码如下:
Java代码
/**
* 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);
}
}
输入结果
Consloe代码
字节压缩/解压缩测试
输入字符串: 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压缩对大字节数据压缩,才能反映出压缩效果。
先占个位儿,回头细致整理!
有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。
压缩工具代码如下:
Java代码
/**
* 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();
}
}
测试用例代码如下:
Java代码
/**
* 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);
}
}
输入结果
Consloe代码
字节压缩/解压缩测试
输入字符串: 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压缩对大字节数据压缩,才能反映出压缩效果。
先占个位儿,回头细致整理!
相关文章推荐
- StringTokenizer类的使用
- java中jdbc事务管理
- 【Java学习-J.160611.0.21】Servlet基础四 cookie部分
- java for 的用法总结
- java中的synchronized
- leetcode 236. Lowest Common Ancestor of a Binary Tree-二叉树共同祖先|深度遍历|递归|非递归
- Spring基础—Bean容器
- 查找代码错误.java
- java创建邮件模板
- Java基础知识强化105:打印数组的方法总结
- java中jdbc调用存储过程
- spring框架简介
- JAVA中关于同步与死锁的问题
- Struts2 框架下 session 读出来为null
- mysql/sql server和java之间的数据类型对应关系
- JavaWeb学习笔记之Log4j使用教程
- Struts.xml中Action的method与路径的三种匹配方法
- eclipse连接MySQL数据库
- Java中的动态代理
- 孩子们的游戏(圆圈中最后剩下的数)--约瑟夫环问题