【问题标题】:Java Decompress a string compressed with zlib deflateJava解压用zlib deflate压缩的字符串
【发布时间】:2016-01-06 08:51:49
【问题描述】:

正如标题所说。如何解压缩用 zlib deflate 压缩的压缩字符串?用解释做这件事的可靠方法是什么?

【问题讨论】:

    标签: java zlib deflate


    【解决方案1】:

    我在谷歌找到了this的文章,里面解释了如何在java中使用zlib进行压缩和解压,希望对你有帮助

    【讨论】:

      【解决方案2】:

      试试这个 - 这是一个最小的工作示例:

      package zlib.example;
      
      import java.io.ByteArrayInputStream;
      import java.io.ByteArrayOutputStream;
      import java.util.Arrays;
      import java.util.zip.Deflater;
      import java.util.zip.DeflaterOutputStream;
      import java.util.zip.InflaterInputStream;
      
      /**
       * Created by keocra on 08.10.15.
       */
      public class Main {
          private final static String inputStr = "Hello World!";
      
          public static void main(String[] args) throws Exception {
              System.out.println("Will zlib compress following string: " + inputStr);
      
              // will compress "Hello World!"
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              DeflaterOutputStream dos = new DeflaterOutputStream(baos);
              dos.write(inputStr.getBytes());
              dos.flush();
              dos.close();
      
              // at this moment baos.toByteArray() holds the compressed data of "Hello World!"
      
              // will decompress compressed "Hello World!"
              ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
              InflaterInputStream iis = new InflaterInputStream(bais);
      
              String result = "";
              byte[] buf = new byte[5];
              int rlen = -1;
              while ((rlen = iis.read(buf)) != -1) {
                  result += new String(Arrays.copyOf(buf, rlen));
              }
      
              // now result will contain "Hello World!"
      
              System.out.println("Decompress result: " + result);
          }
      }
      

      您还应该能够轻松地扩展此示例以压缩/解压缩文件。

      希望对你有帮助 ;-)

      进一步阅读:

      【讨论】:

      • 请更具体地说明您想要做什么。上面的示例未绑定到特定的字符串长度。需要明确的是:更改 inputStr 就足够了。如果要调整示例,还应该将字节缓冲区 (...new byte[5]) 更改为即 new byte[1024]。
      • 那么 byte[] buf 在做什么呢?
      • 我回答这个有点晚了 ;-) byte[] buf = new byte[5];初始化一个空字节数组,该数组用作从输入流中读取的缓冲区。 iis.read(buf) 然后读取最大值。每轮一次来自输入流的 5 个字节。 Arrays.copyOf(buf, rlen) 只是 greps 实际读取的字节数。例如,假设您在输入流中有 23 个字节。每轮读取 5 个字节将导致 4 轮实际读取 5 个字节,最后一轮读取 3 个字节。所以在最后一轮中,我们只对来自 buf 对象的 3 个字节感兴趣。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多