ZLib,GZip,Zip压缩与解压缩工具类

原创 2010年01月27日 11:32:00

package test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import com.jcraft.jzlib.JZlib;
import com.jcraft.jzlib.ZInputStream;
import com.jcraft.jzlib.ZOutputStream;

/**
 * 压缩工具包
 */
public class ZipUtil {

 // 输入数据的最大长度
 private static final int MAXLENGTH = 102400;
 // 设置缓存大小
 private static final int BUFFERSIZE = 1024;
 
 //压缩选择方式:
 //
 ///** Try o get the best possible compression */
 //public static final int COMPRESSION_MAX = JZlib.Z_BEST_COMPRESSION;
 //
 ///** Favor speed over compression ratio */
 //public static final int COMPRESSION_MIN = JZlib.Z_BEST_SPEED;
 //
 ///** No compression */
 //public static final int COMPRESSION_NONE = JZlib.Z_NO_COMPRESSION;
 //
 ///** Default compression */
 //public static final int COMPRESSION_DEFAULT = JZlib.Z_DEFAULT_COMPRESSION;

 /**
  * ZLib压缩数据
  *
  * @param object
  * @return
  * @throws IOException
  */
 public static byte[] zLib(byte[] bContent) throws IOException {

  byte[] data = null;
  try {
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ZOutputStream zOut = new ZOutputStream(out,
     JZlib.Z_BEST_COMPRESSION); // 压缩级别,缺省为1级
   DataOutputStream objOut = new DataOutputStream(zOut);
   objOut.write(bContent);
   objOut.flush();
   zOut.close();
   data = out.toByteArray();
   out.close();

  } catch (IOException e) {
   e.printStackTrace();
   throw e;
  }
  return data;
 }

 /**
  * ZLib解压数据
  *
  * @param object
  * @return
  * @throws IOException
  */
 public static byte[] unZLib(byte[] bContent) throws IOException {

  byte[] data = new byte[MAXLENGTH];
  try {
   ByteArrayInputStream in = new ByteArrayInputStream(bContent);
   ZInputStream zIn = new ZInputStream(in);
   DataInputStream objIn = new DataInputStream(zIn);

   int len = 0;
   int count = 0;
   while ((count = objIn.read(data, len, len + BUFFERSIZE)) != -1) {
    len = len + count;
   }

   byte[] trueData = new byte[len];
   System.arraycopy(data, 0, trueData, 0, len);

   objIn.close();
   zIn.close();
   in.close();

   return trueData;

  } catch (IOException e) {
   e.printStackTrace();
   throw e;
  }
 }

 /**
  * GZip压缩数据
  *
  * @param object
  * @return
  * @throws IOException
  */
 public static byte[] gZip(byte[] bContent) throws IOException {

  byte[] data = null;
  try {
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   
   GZIPOutputStream gOut = new GZIPOutputStream(out, bContent.length); // 压缩级别,缺省为1级
   DataOutputStream objOut = new DataOutputStream(gOut);
   objOut.write(bContent);
   objOut.flush();
   gOut.close();
   data = out.toByteArray();
   out.close();

  } catch (IOException e) {
   e.printStackTrace();
   throw e;
  }
  return data;
 }

 /**
  * GZip解压数据
  *
  * @param object
  * @return
  * @throws IOException
  */
 public static byte[] unGZip(byte[] bContent) throws IOException {

  byte[] data = new byte[MAXLENGTH];
  try {
   ByteArrayInputStream in = new ByteArrayInputStream(bContent);
   GZIPInputStream pIn = new GZIPInputStream(in);
   DataInputStream objIn = new DataInputStream(pIn);

   int len = 0;
   int count = 0;
   while ((count = objIn.read(data, len, len + BUFFERSIZE)) != -1) {
    len = len + count;
   }

   byte[] trueData = new byte[len];
   System.arraycopy(data, 0, trueData, 0, len);

   objIn.close();
   pIn.close();
   in.close();

   return trueData;

  } catch (IOException e) {
   e.printStackTrace();
   throw e;
  }
 }

 /***
  * 压缩Zip
  *
  * @param data
  * @return
  * @throws IOException
  */
 public static byte[] zip(byte[] bContent) throws IOException {

  byte[] b = null;
  try {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   ZipOutputStream zip = new ZipOutputStream(bos);
   ZipEntry entry = new ZipEntry("zip");
   entry.setSize(bContent.length);
   zip.putNextEntry(entry);
   zip.write(bContent);
   zip.closeEntry();
   zip.close();
   b = bos.toByteArray();
   bos.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }

 /***
  * 解压Zip
  *
  * @param data
  * @return
  * @throws IOException
  */
 public static byte[] unZip(byte[] bContent) throws IOException {
  byte[] b = null;
  try {
   ByteArrayInputStream bis = new ByteArrayInputStream(bContent);
   ZipInputStream zip = new ZipInputStream(bis);
   while (zip.getNextEntry() != null) {
    byte[] buf = new byte[1024];
    int num = -1;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((num = zip.read(buf, 0, buf.length)) != -1) {
     baos.write(buf, 0, num);
    }
    b = baos.toByteArray();
    baos.flush();
    baos.close();
   }
   zip.close();
   bis.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }
 
 public static void main(String[] args) {
  String newContent = "";

  try {
   String content = "干哈捡垃圾改了倒是几啊该近哦怎么冷静斯洛克发生过年萨嘎丝巾官商勾结撒该赏菊管理局进苦力哈哈四欧洲女方家萨嘎嘎嘎怒日颇为勤能补拙个少普宁该萨嘎为此该萨嘎年经普年均可与飞洒你亚冠的丧尽和";
   System.out.println(content);
   byte[] origin = content.getBytes();
   System.out.println("原始长度 length is : " + origin.length);
   
   // ZLib 压缩
   byte[] zLibCnt = zLib(origin);
   System.out.println("zLib压缩后长度 : " + zLibCnt.length);

   byte[] unzLibCnt = unZLib(zLibCnt);
   System.out.println("zLib解压后长度 : "
     + unzLibCnt.length);
   
   newContent = new String(unzLibCnt);
   System.out.println(newContent);

   // GZip 压缩
   byte[] gZipCnt = gZip(origin);
   System.out.println("GZip压缩后长度 : " + gZipCnt.length);

   byte[] ungZipCnt = unGZip(gZipCnt);
   System.out.println("GZip解压后长度 : "
     + ungZipCnt.length);
   
   newContent = new String(ungZipCnt);
   System.out.println(newContent);
   
   // Zip 压缩
   byte[] zipCnt = zip(origin);
   System.out.println("Zip压缩后长度 : " + zipCnt.length);

   byte[] unZipCnt = unZip(zipCnt);
   System.out.println("Zip解压后长度 : "
     + unZipCnt.length);
   
   newContent = new String(unZipCnt);
   System.out.println(newContent);
  } catch (Exception e) {
   e.printStackTrace();
  }

 }
}

 

ruby直接字符串压缩与解压缩

ruby2.1.3的核心类中包含了Zlib库,其中的Zlib模块包含了对字符串压缩和解压的方法: irb(main):180:0> Zlib.class => Module irb(main):181...
  • mydo
  • mydo
  • 2014年12月05日 09:48
  • 1751

使用zlib库函数实现http报文的解压

最近做项目的时候遇到了一个问题,那就是需要获得http响应报文主体内容,一般响应主体会通过gzip格式进行压缩,本文就是针对这种情况所写的,可以进行内存解压,而不需要保存至本地文件再解压。至于chun...
  • liuchonge
  • liuchonge
  • 2015年10月25日 21:14
  • 2322

GZIP/ZIP压缩与解压缩

1. 用GZIP类可进行单文件的压缩及压缩包内容的读取 package cn.yjq.interview; import java.io.BufferedReader; import java.io...
  • y172158950
  • y172158950
  • 2014年02月19日 15:53
  • 2943

字符串解压缩类库(zip、GZIP、QuickLz、snappy、lzf、jzlib)性能对比

测试说明: 1、版本:       ZIP、GZIP :JDK1.6版;QuickLZ: 1.5.0 final;Snappy:1.1.1.6       LZF:1.0.3;JZLIB:1....
  • MCpang
  • MCpang
  • 2014年11月15日 05:36
  • 3764

c# 下怎么使用zlib/gzip压缩和解压缩?(GALGAME和Flash使用的压缩格式)

c# 下怎么使用zlib?   zlib是开源的压缩格式  源代码和DLL可以去http://www.zlib.net/    bzip2是建立在libbzip2   破解GALGAME时候很多人发现...
  • luozhuang
  • luozhuang
  • 2008年11月30日 22:31
  • 7164

LINUX、C#下使用zlib进行对称压缩、解压

zlib是一个压缩库,封装了多个算法,我们这里使用的是zip。 一、准备zlib的LINUX及C#库 zlib项目地址: http://www.zlib.net/ zlib.net项目...
  • ToAsuN
  • ToAsuN
  • 2016年01月09日 10:48
  • 2081

Zip压缩、解压缩方法(GZip)

        /**////         /// 以Zip格式压缩指定文件        ///         /// 要压缩的文件路径        /// 压缩后保存的文件路径      ...
  • manasheep
  • manasheep
  • 2007年06月12日 04:34
  • 692

zlib,gzip,zip,7z压缩的区别

zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么)。 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件。gzip在压缩文件...
  • lanmenghcc
  • lanmenghcc
  • 2014年10月14日 09:20
  • 8360

nodejs 压缩和解压

var zlib = require('zlib'); var async = require('async'); function gzip(text){ var buf = new Bu...
  • dai_jing
  • dai_jing
  • 2015年08月04日 11:09
  • 4007

java工具类——java将一串数据按照gzip方式压缩和解压缩

我要整理在工作中用到的工具类分享出来,也方便自己以后查阅使用,这些工具类都是我自己实际工作中使用的 import java.io.ByteArrayInputStream; import java....
  • qq_18895659
  • qq_18895659
  • 2017年05月15日 19:29
  • 1197
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZLib,GZip,Zip压缩与解压缩工具类
举报原因:
原因补充:

(最多只允许输入30个字)