【问题标题】:How does GZIP decompression work in chunks?GZIP 解压是如何分块工作的?
【发布时间】:2016-10-28 11:12:08
【问题描述】:

我正在使用 GZIP 压缩来压缩文件。考虑解压的代码sn-p

public static void decompress(File compressed, File raw)
    throws IOException
{
    InputStream in =
        new GZIPInputStream(new FileInputStream(compressed));
    OutputStream out = new FileOutputStream(raw);
    byte[] buffer = new byte[1000];
    int len;
    while((len = in.read(buffer)) > 0) {
        out.write(buffer, 0, len);
    }
    in.close();
    out.close();
}

请澄清以下内容

  1. 这是否会以块的形式解压缩文件(即解压缩仅在缓冲区中读取的文件内容)
  2. 这是否与解压缩整个文件相同(即,通过提供非常大的缓冲区大小)。如果有怎么办?
  3. GZIP 算法读取多少字节来压缩/解压一圈?这是按字节读取还是 GZIP 会读取缓冲区中的全部内容以进行压缩/解压缩?
  4. 分块压缩文件与整个文件的压缩率?

【问题讨论】:

  • 这不会压缩任何东西。
  • 对不起,这是我的错误。刚刚附上解压示例代码。
  • 这里没有GZIP解压,虽然应该有。压缩到文件的工作方式与压缩到任何其他流的方式相同,相反 dpso 进行解压缩。你的问题的动机是模糊的。不要对未引用的文本使用引号格式。
  • 我在这里知道的动机是 gzip 文件压缩会不同 i) 当我们输入整个文件时和 ii) 当我们读取缓冲区中的文件并将缓冲区内容提供给压缩写入 gzip 压缩时。跨度>

标签: java compression gzip


【解决方案1】:
  1. 是的,它会分块解压。
  2. 是的,结果将与将其解压缩为一个块相同。 (尽管您的代码永远不会这样做,无论 buffer 有多大。)
  3. 解压器本身将使用给定的尽可能多的字节,并尽可能多地从这些字节中解压。
  4. 您的代码未压缩。如果是这样,则答案是压缩结果不受分块的影响,除非插入刷新操作。

【讨论】:

  • 我无法理解您所说的第四点 unless flush operations are inserted 这不会影响压缩率。你能解释一下怎么做吗? TIA。
  • 压缩后的数据在压缩状态下累积在缓冲区中。无论您一次输入一个字节还是一次输入千兆字节,压缩器都会执行完全相同的操作。
  • 你能在how the compressor works like the same whether we feed it one byte at a time or a gigabyte at a time上给我解释一下吗...
  • “缓冲区”这个词应该很明显。
  • 然后请考虑我使用 gzip 压缩文件(通过缓冲区大小为 X 的 java 程序)和另一个通过右键单击文件 -> compress 压缩文件的情况。两者都给了我相同的结果。你能解释一下这是怎么发生的吗?缓冲区大小会影响最终的压缩吗?有人请帮助我了解更多相关信息。
猜你喜欢
  • 2011-12-06
  • 2012-12-02
  • 2011-01-26
  • 2012-09-04
  • 1970-01-01
  • 2012-08-22
  • 2014-10-21
  • 2012-06-26
  • 1970-01-01
相关资源
最近更新 更多