用到3个类
ZipUtil.java包含压缩解压string的方法
ZipUtilException.java压缩解压自定义异常类
ZipUtilTest.java测试类
ZipUtil.java
package util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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 org.apache.log4j.Logger;
/**
* @Title 压缩工具类
* @Description Linux系统gzip压缩,gunzip解压;Windows系统用zip压缩,unzip解压.
* @author wangzs
* @date 2016-4-15
*/
public class ZipUtil {
private static Logger logger = Logger.getLogger(ZipUtil.class);
/**
* 使用gzip进行压缩
*
* @param str
* 需要压缩的字符
* @return 压缩后的字符
* @throws ZipUtilException
* @throws UnsupportedEncodingException
*/
public static String gzip(String str) throws ZipUtilException {
if (str == null) {
logger.error("使用gzip进行压缩,输入字符为null.");
throw new ZipUtilException("使用gzip进行压缩,输入字符为null.");
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
// GZIPOutputStream 此类为使用 GZIP 文件格式写入压缩数据实现流过滤器。
GZIPOutputStream gzip = null;
try {
gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
} catch (IOException e) {
logger.error("使用gzip进行压缩exception." + e.getMessage());
throw new ZipUtilException("使用gzip进行压缩exception.", e);
} finally {
if (gzip != null) {
try {
gzip.close();
} catch (IOException e) {
logger.error("使用gzip进行压缩,关闭GZIPOutputStream流exception." + e.getMessage());
throw new ZipUtilException("使用gzip进行压缩,关闭GZIPOutputStream流exception.", e);
}
}
}
return new sun.misc.BASE64Encoder().encode(out.toByteArray());
}
/**
* 使用gunzip进行解压
*
* @param str
* 需要解压的字符
* @return 解压后的字符
* @throws ZipUtilException
*/
public static String gunzip(String str) throws ZipUtilException {
if (str == null) {
logger.error("使用gunzip进行解压,输入字符为null.");
throw new ZipUtilException("使用gunzip进行解压,输入字符为null.");
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = null;
// GZIPInputStream此类为读取 GZIP 文件格式的压缩数据实现流过滤器。
GZIPInputStream ginzip = null;
byte[] compressed = null;
String decompressed = null;
try {
compressed = new sun.misc.BASE64Decoder().decodeBuffer(str);
in = new ByteArrayInputStream(compressed);
ginzip = new GZIPInputStream(in);
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = ginzip.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
logger.error("使用gunzip进行解压exception." + e.getMessage());
throw new ZipUtilException("使用gunzip进行解压exception.", e);
} finally {
if (ginzip != null) {
try {
ginzip.close();
} catch (IOException e) {
logger.error("使用gzip进行解压,关闭GZIPInputStream流exception." + e.getMessage());
throw new ZipUtilException("使用gzip进行解压,关闭GZIPInputStream流exception.", e);
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
logger.error("使用gunzip进行解压,关闭ByteArrayInputStream流exception." + e.getMessage());
throw new ZipUtilException("使用gunzip进行解压,关闭ByteArrayInputStream流exception.", e);
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error("使用gunzip进行解压,关闭ByteArrayOutputStream流exception." + e.getMessage());
throw new ZipUtilException("使用gunzip进行解压,关闭ByteArrayOutputStream流exception.", e);
}
}
}
return decompressed;
}
/**
* 使用zip进行压缩
*
* @param str
* 需要压缩的字符
* @return 压缩后的字符
* @throws ZipUtilException
*/
public static final String zip(String str) throws ZipUtilException {
if (str == null) {
logger.error("使用zip进行压缩,输入字符为null.");
throw new ZipUtilException("使用zip进行压缩,输入字符为null.");
}
byte[] compressed;
ByteArrayOutputStream out = null;
// ZipOutputStream此类为以 ZIP 文件格式写入文件实现输出流过滤器。包括对已压缩和未压缩条目的支持。
ZipOutputStream zout = null;
String compressedStr = null;
try {
out = new ByteArrayOutputStream();
zout = new ZipOutputStream(out);
zout.putNextEntry(new ZipEntry("0"));
zout.write(str.getBytes());
zout.closeEntry();
compressed = out.toByteArray();
compressedStr = new sun.misc.BASE64Encoder().encodeBuffer(compressed);
} catch (IOException e) {
compressed = null;
} finally {
if (zout != null) {
try {
zout.close();
} catch (IOException e) {
logger.error("使用zip进行压缩,关闭ZipOutputStream流exception." + e.getMessage());
throw new ZipUtilException("使用zip进行压缩,关闭ZipOutputStream流exception.", e);
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error("使用zip进行压缩,关闭ByteArrayOutputStream流exception." + e.getMessage());
throw new ZipUtilException("使用zip进行压缩,关闭ByteArrayOutputStream流exception.", e);
}
}
}
return compressedStr;
}
/**
* 使用unzip进行解压
*
* @param str
* 需要解压的字符
* @return 解压后的字符
* @throws ZipUtilException
*/
public static final String unzip(String str) throws ZipUtilException {
if (str == null) {
logger.error("使用unzip进行解压,输入字符为null.");
throw new ZipUtilException("使用unzip进行解压,输入字符为null.");
}
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
// ZipInputStream此类为读取 ZIP 文件格式的文件实现输入流过滤器。包括对已压缩和未压缩条目的支持。
ZipInputStream zin = null;
String decompressed = null;
try {
byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(str);
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();
} catch (IOException e) {
decompressed = null;
} finally {
if (zin != null) {
try {
zin.close();
} catch (IOException e) {
logger.error("使用unzip进行解压,关闭ZipInputStream流exception." + e.getMessage());
throw new ZipUtilException("使用unzip进行解压,关闭ZipInputStream流exception.", e);
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
logger.error("使用unzip进行解压,关闭ByteArrayInputStream流exception." + e.getMessage());
throw new ZipUtilException("使用unzip进行解压,关闭ByteArrayInputStream流exception.", e);
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error("使用unzip进行解压,关闭ByteArrayOutputStream流exception." + e.getMessage());
throw new ZipUtilException("使用unzip进行解压,关闭ByteArrayOutputStream流exception.", e);
}
}
}
return decompressed;
}
}
ZipUtilException.java
package util;
/**
* @Title 压缩工具类ZipUtil自定义异常
* @Description 压缩工具类ZipUtil自定义异常
* @author wangzs
* @date 2016-4-15
*/
public class ZipUtilException extends Exception {
private static final long serialVersionUID = 7188947115083638233L;
public ZipUtilException() {
super();
}
public ZipUtilException(String message) {
super(message);
}
public ZipUtilException(String message, Throwable cause) {
super(message, cause);
}
}
ZipUtilTest.java
package util;
import org.junit.Assert;
import org.junit.Test;
/**
* @Title ZipUtil压缩工具类测试
* @Description ZipUtil压缩工具类测试
* @author wangzs
* @date 2016-4-15
*/
public class ZipUtilTest {
private static String LOCAL_STR = "我们都是中国人0123456789qwertyuiopasdfghjklzxcvbnm,/~·.~!@#¥%……&*()——+.<>/?;':";
// private static String LOCAL_STR = "";
// private static String LOCAL_STR = null;
@Test
public void test_gzip() {
System.out.println("原始字符:" + LOCAL_STR);
String gzipStr = "";
try {
gzipStr = ZipUtil.gzip(LOCAL_STR);
} catch (ZipUtilException e) {
e.printStackTrace();
}
System.out.println("gzip压缩结果:" + gzipStr);
System.out.println("----------------------");
}
@Test
public void test_gunzip() {
System.out.println("原始字符:" + LOCAL_STR);
String gzipStr = "";
try {
gzipStr = ZipUtil.gzip(LOCAL_STR);
} catch (ZipUtilException e) {
e.printStackTrace();
}
System.out.println("gzip压缩结果:" + gzipStr);
String gunzipStr = "";
try {
gunzipStr = ZipUtil.gunzip(gzipStr);
} catch (ZipUtilException e) {
e.printStackTrace();
}
System.out.println("gunzip解压结果:" + gunzipStr);
Assert.assertEquals(LOCAL_STR, gunzipStr);
System.out.println("----------------------");
}
@Test
public void test_zip() {
System.out.println("原始字符:" + LOCAL_STR);
String zipStr = "";
try {
zipStr = ZipUtil.zip(LOCAL_STR);
} catch (ZipUtilException e) {
e.printStackTrace();
}
System.out.println("zip压缩结果:" + zipStr);
System.out.println("----------------------");
}
@Test
public void test_unzip() {
System.out.println("原始字符:" + LOCAL_STR);
String zipStr = "";
try {
zipStr = ZipUtil.zip(LOCAL_STR);
} catch (ZipUtilException e) {
e.printStackTrace();
}
System.out.println("zip压缩结果:" + zipStr);
String unzipStr = "";
try {
unzipStr = ZipUtil.unzip(zipStr);
} catch (ZipUtilException e) {
e.printStackTrace();
}
System.out.println("unzip解压结果:" + unzipStr);
Assert.assertEquals(LOCAL_STR, unzipStr);
System.out.println("----------------------");
}
}