Java压缩技术(一) ZLib,java压缩技术zlib
分享于 点击 23292 次 点评:87
Java压缩技术(一) ZLib,java压缩技术zlib
应好友需要,整理一下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
- */
- packageorg.zlex.commons.io;
- importjava.io.ByteArrayOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.util.zip.Deflater;
- importjava.util.zip.DeflaterOutputStream;
- importjava.util.zip.Inflater;
- importjava.util.zip.InflaterInputStream;
- /**
- *ZLib压缩工具
- *
- *@author<ahref="mailto:zlex.dongliang@gmail.com">梁栋</a>
- *@version1.0
- *@since1.0
- */
- publicabstractclassZLibUtils{
- /**
- *压缩
- *
- *@paramdata
- *待压缩数据
- *@returnbyte[]压缩后的数据
- */
- publicstaticbyte[]compress(byte[]data){
- byte[]output=newbyte[0];
- Deflatercompresser=newDeflater();
- compresser.reset();
- compresser.setInput(data);
- compresser.finish();
- ByteArrayOutputStreambos=newByteArrayOutputStream(data.length);
- try{
- byte[]buf=newbyte[1024];
- while(!compresser.finished()){
- inti=compresser.deflate(buf);
- bos.write(buf,0,i);
- }
- output=bos.toByteArray();
- }catch(Exceptione){
- output=data;
- e.printStackTrace();
- }finally{
- try{
- bos.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- compresser.end();
- returnoutput;
- }
- /**
- *压缩
- *
- *@paramdata
- *待压缩数据
- *
- *@paramos
- *输出流
- */
- publicstaticvoidcompress(byte[]data,OutputStreamos){
- DeflaterOutputStreamdos=newDeflaterOutputStream(os);
- try{
- dos.write(data,0,data.length);
- dos.finish();
- dos.flush();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- /**
- *解压缩
- *
- *@paramdata
- *待压缩的数据
- *@returnbyte[]解压缩后的数据
- */
- publicstaticbyte[]decompress(byte[]data){
- byte[]output=newbyte[0];
- Inflaterdecompresser=newInflater();
- decompresser.reset();
- decompresser.setInput(data);
- ByteArrayOutputStreamo=newByteArrayOutputStream(data.length);
- try{
- byte[]buf=newbyte[1024];
- while(!decompresser.finished()){
- inti=decompresser.inflate(buf);
- o.write(buf,0,i);
- }
- output=o.toByteArray();
- }catch(Exceptione){
- output=data;
- e.printStackTrace();
- }finally{
- try{
- o.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- decompresser.end();
- returnoutput;
- }
- /**
- *解压缩
- *
- *@paramis
- *输入流
- *@returnbyte[]解压缩后的数据
- */
- publicstaticbyte[]decompress(InputStreamis){
- InflaterInputStreamiis=newInflaterInputStream(is);
- ByteArrayOutputStreamo=newByteArrayOutputStream(1024);
- try{
- inti=1024;
- byte[]buf=newbyte[i];
- while((i=iis.read(buf,0,i))>0){
- o.write(buf,0,i);
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returno.toByteArray();
- }
- }
测试用例代码如下:
Java代码
- /**
- *2009-9-9
- */
- packageorg.zlex.commons.io;
- importstaticorg.junit.Assert.*;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importorg.junit.Test;
- /**
- *ZLib压缩测试用例
- *
- *@author<ahref="mailto:zlex.dongliang@gmail.com">梁栋</a>
- *@version1.0
- *@since1.0
- */
- publicclassZLibUtilsTest{
- @Test
- publicfinalvoidtestBytes(){
- System.err.println("字节压缩/解压缩测试");
- StringinputStr="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);
- StringoutputStr=newString(output);
- System.err.println("输出字符串:\t"+outputStr);
- assertEquals(inputStr,outputStr);
- }
- @Test
- publicfinalvoidtestFile(){
- Stringfilename="zlib";
- Filefile=newFile(filename);
- System.err.println("文件压缩/解压缩测试");
- StringinputStr="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{
- FileOutputStreamfos=newFileOutputStream(file);
- ZLibUtils.compress(input,fos);
- fos.close();
- System.err.println("压缩后字节长度:\t"+file.length());
- }catch(Exceptione){
- fail(e.getMessage());
- }
- byte[]output=null;
- try{
- FileInputStreamfis=newFileInputStream(file);
- output=ZLibUtils.decompress(fis);
- fis.close();
- }catch(Exceptione){
- fail(e.getMessage());
- }
- System.err.println("解压缩后字节长度:\t"+output.length);
- StringoutputStr=newString(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实现
相关文章
- 暂无相关文章
用户点评