找回密码
 立即注册
首页 业界区 业界 Java中Deflater和GZIP的压缩/解压实现

Java中Deflater和GZIP的压缩/解压实现

馑妣窟 2025-6-14 08:50:37
以下是Java中Deflater和GZIP的压缩/解压实现及优缺点对比:

一、Deflater实现(原始DEFLATE格式)

1. 压缩方法
  1.     public static String compress(String rawData) {
  2.         Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true); // nowrap=true
  3.         try {
  4.             deflater.setInput(rawData.getBytes(StandardCharsets.UTF_8));
  5.             deflater.finish();
  6.             try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
  7.                 byte[] buffer = new byte[8192];
  8.                 while (!deflater.finished()) {
  9.                     int compressedBytes = deflater.deflate(buffer);
  10.                     bos.write(buffer, 0, compressedBytes);
  11.                 }
  12.                 return Base64.getUrlEncoder().withoutPadding()
  13.                          .encodeToString(bos.toByteArray());
  14.             }
  15.         } finally {
  16.             deflater.end();
  17.         }
  18.     }
复制代码
2. 解压方法
  1.     public static String decompress(String compressedData) {
  2.         Inflater inflater = new Inflater(true);
  3.         try {
  4.             byte[] compressedBytes = Base64.getUrlDecoder().decode(compressedData);
  5.             inflater.setInput(compressedBytes);
  6.             try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
  7.                 byte[] buffer = new byte[8192];
  8.                 while (!inflater.finished()) {
  9.                     try {
  10.                         int decompressedBytes = inflater.inflate(buffer);
  11.                         bos.write(buffer, 0, decompressedBytes);
  12.                     } catch (DataFormatException e) {
  13.                         throw new RuntimeException("数据损坏", e);
  14.                     }
  15.                 }
  16.                 return bos.toString(StandardCharsets.UTF_8);
  17.             }
  18.         } finally {
  19.             inflater.end();
  20.         }
  21.     }
复制代码
二、GZIP实现(标准gzip格式)

1. 压缩方法
  1.     public static String compress(String rawData) throws IOException {
  2.         try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
  3.              GZIPOutputStream gzip = new GZIPOutputStream(bos)) {
  4.             
  5.             gzip.write(rawData.getBytes(StandardCharsets.UTF_8));
  6.             gzip.finish();
  7.             return Base64.getEncoder().encodeToString(bos.toByteArray());
  8.         }
  9.     }
复制代码
2. 解压方法
  1.     public static String decompress(String compressedData) throws IOException {
  2.         byte[] compressedBytes = Base64.getDecoder().decode(compressedData);
  3.         try (ByteArrayInputStream bis = new ByteArrayInputStream(compressedBytes);
  4.              GZIPInputStream gzip = new GZIPInputStream(bis);
  5.              ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
  6.             
  7.             byte[] buffer = new byte[8192];
  8.             int len;
  9.             while ((len = gzip.read(buffer)) > 0) {
  10.                 bos.write(buffer, 0, len);
  11.             }
  12.             return bos.toString(StandardCharsets.UTF_8);
  13.         }
  14.     }
复制代码
三、优缺点对比

特性Deflater (DEFLATE)GZIP压缩率≈95%(无头部,极限压缩)≈93%(含18字节头部)速度稍快(无头部开销)稍慢(需处理头部)兼容性需特殊解析器通用解压工具支持典型应用场景网络传输、内存敏感型应用文件存储、通用数据交换头部开销无18字节(含时间戳等元数据)校验和无有(CRC32)流式处理需手动管理缓冲区支持流式API四、选型建议


  • 优先选GZIP的场景

    • 需要与其他系统交互时
    • 处理文件存储或日志压缩时
    • 需要内置校验和验证数据完整性时

  • 优先选Deflater的场景

    • 追求极限压缩率时
    • 进行网络传输(尤其对延迟敏感时)
    • 需要自定义协议格式时

  • 通用原则

    • 短文本(1MB)可结合缓冲流处理

实际测试显示,对于典型英文文本,Deflater比GZIP压缩率高约2-5%,但解压速度慢约10-15%。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册