用到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; } }
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("----------------------"); } }