athrunwang
纪元
BlogJava
首页
新随笔
联系
聚合
管理
数据加载中……
Java压缩技术(一) ZLib 转贴 Snowolf的意境空间! http://snowolf.iteye.com/blog/465433
Snowolf的意境空间!
转贴:
http://snowolf.iteye.com/blog/465433
应好友需要,整理一下Java的压缩算法,先从ZLib开始。
相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现
有关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压缩对大字节数据压缩,才能反映出压缩效果。
先占个位儿,回头细致整理!
相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现
posted on 2011-12-26 09:50
AthrunWang
阅读(582)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
<
2011年12月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 72
文章 - 0
评论 - 15
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2014年2月 (8)
2013年9月 (2)
2013年3月 (1)
2013年1月 (1)
2012年10月 (1)
2012年9月 (3)
2012年6月 (2)
2012年5月 (2)
2012年4月 (1)
2012年3月 (6)
2012年2月 (1)
2012年1月 (9)
2011年12月 (18)
2011年11月 (14)
2011年10月 (2)
2011年9月 (1)
搜索
最新评论
1. re: myeclipse优化方案 myeclipse 10 优化 [未登录]
123
--123
2. re: [笔记]war,jar包是啥
解释得很详细,很经典,学到东西了!
--smiling
3. re: Java 生成视频缩略图(ffmpeg)
评论内容较长,点击标题查看
--最代码
4. re: Java验证码
评论内容较长,点击标题查看
--最代码
5. re: java播放mp3
怎么暂停?close直接就关掉了
--vh
阅读排行榜
1. StringUtils详细介绍(27294)
2. myeclipse优化方案 myeclipse 10 优化 (26803)
3. [导入][转载]java中用URLConnection 类post方式提交表单(11178)
4. [笔记]war,jar包是啥(7429)
5. 用org.apache.tools.zip压缩/解压缩zip文件(5267)
评论排行榜
1. StringUtils详细介绍(3)
2. Java验证码(3)
3. myeclipse优化方案 myeclipse 10 优化 (2)
4. 新浪一道面试题:写一个函数,计算两个文件的相对路径的递归算法(2)
5. java播放mp3(1)