Java中ZIP与Gzip的压缩与解压处理,其中有Base64处理
2015-10-10 18:01
501 查看
1、ZIP压缩与解压
2、GZIP压缩与解压
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>
相关文章推荐
- java学习日记----------------------封装的日期类MyDate
- java核心技术之reflect(一):一个系统学习reflect的Demo(精)
- Java语音SDK接口开发经验及具体开发实现
- Servlet与一般Java类的区别是什么?
- java 代理模式
- JAVA操作Excel文件 JXL
- java ReentrantLock可重入锁功能
- 基础学习--调试/intellij快捷键
- 在 Java 应用程序中访问 USB 设备
- 使用Java对数据库进行基本的查询和更新操作
- java基础
- 虚拟机操作---JDK与Hadoop的安装
- java如何获取当前时间的方法汇总
- java二叉树 TreeMap集合测试
- 用java来写一个猜数字游戏,要用到界面
- java代码获知该方法被哪个类、哪个方法、在哪一行调用
- Java编程思想(一) —— 一切都是对象及内存分配
- [JAVA]定时任务之-Quartz使用篇
- SpringMVC收发带CDATA的xml报文
- myeclipse2015最简单破解