您的位置:首页 > 编程语言 > Java开发

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

2015-10-10 18:01 501 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: