Java中ZIP与Gzip的压缩与解压处理,其中有Base64处理

1、ZIP压缩与解压

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import com.fusion.areain.common.Constants;

/**
 * 
 * 对字符串进行加解密和加解压
 * @author ***
 *
 */
@SuppressWarnings("restriction")
public class ZipUtil {
	
	private static Logger log = LoggerFactory.getLogger(ZipUtil.class);
	
	/**
	 * 将字符串压缩后Base64
	 * @param primStr 待加压加密函数
	 * @return
	 */
	public static String zipString(String primStr) {
		if (primStr == null || primStr.length() == 0) {
			return primStr;
		}
		ByteArrayOutputStream out = null;  
		ZipOutputStream zout = null;  
		try{  
			out = new ByteArrayOutputStream();  
			zout = new ZipOutputStream(out);  
			zout.putNextEntry(new ZipEntry("0"));
			zout.write(primStr.getBytes(Constants.transfer_charset));  
			zout.closeEntry();
			return new BASE64Encoder().encode(out.toByteArray());
		} catch (IOException e) {
			log.error("对字符串进行加压加密操作失败:", e);
			return null;
		} finally {
			if (zout != null) {
				try {
					zout.close();
				} catch (IOException e) {
					log.error("对字符串进行加压加密操作,关闭zip操作流失败:", e);
				}
			}
		}
	}
	
	/**
	 * 将压缩并Base64后的字符串进行解密解压
	 * @param compressedStr 待解密解压字符串
	 * @return
	 */
	public static final String unzipString(String compressedStr) {
		if (compressedStr == null) {
			return null;
		}
		ByteArrayOutputStream out = null;
		ByteArrayInputStream in = null;
		ZipInputStream zin = null;
		String decompressed = null;
		try {
			byte[] compressed = new BASE64Decoder().decodeBuffer(compressedStr);
			out = new ByteArrayOutputStream();
			in = new ByteArrayInputStream(compressed);
			zin = new ZipInputStream(in);
			zin.getNextEntry();
			byte[] buffer = new byte[1024];
			int offset = -1;
			while((offset = zin.read(buffer)) != -1) {
				out.write(buffer, 0, offset);
			}
			decompressed = out.toString(Constants.transfer_charset);
		} catch (IOException e) {
			log.error("对字符串进行解密解压操作失败:", e);
			decompressed = null;
		} finally {
			if (zin != null) {
				try {
					zin.close();
				} catch (IOException e) {
					log.error("对字符串进行解密解压操作,关闭压缩流失败:", e);
				}
			}
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					log.error("对字符串进行解密解压操作,关闭输入流失败:", e);
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					log.error("对字符串进行解密解压操作,关闭输出流失败:", e);
				}
			}
		}
		return decompressed;
	}
}
使用ZIP进行处理是对于JAVA本身可以互相处理,但是Java压缩的结果C#不能解压,后来修改为GZIP就可以了。

2、GZIP压缩与解压

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import com.fusion.areain.common.Constants;

/**
 * 
 * 对字符串进行加解密和加解压
 * @author wujh
 *
 */
@SuppressWarnings("restriction")
public class GZipUtil {
	
	private static Logger log = LoggerFactory.getLogger(GZipUtil.class);
	
	/**
	 * 将字符串压缩后Base64
	 * @param primStr 待加压加密函数
	 * @return
	 */
	public static String gzipString(String primStr) {
		if (primStr == null || primStr.length() == 0) {
			return primStr;
		}
		ByteArrayOutputStream out = null;  
		GZIPOutputStream gout = null;  
		try{  
			out = new ByteArrayOutputStream();  
			gout = new GZIPOutputStream(out);
			gout.write(primStr.getBytes(Constants.transfer_charset));  
			gout.flush();
		} catch (IOException e) {
			log.error("对字符串进行加压加密操作失败:", e);
			return null;
		} finally {
			if (gout != null) {
				try {
					gout.close();
				} catch (IOException e) {
					log.error("对字符串进行加压加密操作,关闭gzip操作流失败:", e);
				}
			}
		}
		return new BASE64Encoder().encode(out.toByteArray());
	}
	
	/**
	 * 将压缩并Base64后的字符串进行解密解压
	 * @param compressedStr 待解密解压字符串
	 * @return
	 */
	public static final String ungzipString(String compressedStr) {
		if (compressedStr == null) {
			return null;
		}
		ByteArrayOutputStream out = null;
		ByteArrayInputStream in = null;
		GZIPInputStream gin = null;
		String decompressed = null;
		try {
			byte[] compressed = new BASE64Decoder().decodeBuffer(compressedStr);
			out = new ByteArrayOutputStream();
			in = new ByteArrayInputStream(compressed);
			gin = new GZIPInputStream(in);
			byte[] buffer = new byte[1024];
			int offset = -1;
			while((offset = gin.read(buffer)) != -1) {
				out.write(buffer, 0, offset);
			}
			decompressed = out.toString(Constants.transfer_charset);
		} catch (IOException e) {
			log.error("对字符串进行解密解压操作失败:", e);
			decompressed = null;
		} finally {
			if (gin != null) {
				try {
					gin.close();
				} catch (IOException e) {
					log.error("对字符串进行解密解压操作,关闭压缩流失败:", e);
				}
			}
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					log.error("对字符串进行解密解压操作,关闭输入流失败:", e);
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					log.error("对字符串进行解密解压操作,关闭输出流失败:", e);
				}
			}
		}
		return decompressed;
	}
	
	public static void main(String[] args) {
		System.out.println(ungzipString(gzipString("1234567")));
	}
}
使用GZIP压缩的时候需要注意,
<strong style="background-color: rgb(204, 102, 0);">return new BASE64Encoder().encode(out.toByteArray());需要放在out对象关闭之后,不然解压时会报错。</strong>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值