【问题标题】:Setting Size of Java Deflater (and Inflater) Output Byte Buffer设置 Java Deflater(和 Inflater)输出字节缓冲区的大小
【发布时间】:2013-01-07 08:06:01
【问题描述】:

我需要压缩一个或多个字节数组,然后再将它们膨胀回正常大小。我查看了api docs 中给出的示例,并找到了一些其他示例。

查看这些示例后,我有两个问题可能不相关,但在我试图理解这一点时,它们似乎相互关联。

  1. 在 API 文档示例中,Inflater 和 Deflater 的输出缓冲区都设置为 1024 字节。示例数据只是一个简短的句子,因此是合理的。但是我怎么知道输出缓冲区有多大呢?还是 Deflater(和 Inflater)会根据需要调整输出缓冲区的大小?

  2. 我可以使用 ByteArrayOutputStream 并将 DeflatorOutputStream 包装在其周围,而不是猜测缓冲区的大小吗?由于 ByteArrayOutputStream 改变了字节数组的大小,因此不必知道输出的大小或猜测它,就像在 API 示例中似乎必须做的那样。

【问题讨论】:

    标签: java zlib deflate


    【解决方案1】:

    1.在 API 文档示例中,Inflater 和 Deflater 的输出缓冲区都设置为 1024 字节。示例数据只是一个简短的句子,因此是合理的。但是我怎么知道输出缓冲区有多大呢?还是 Deflater(和 Inflater)会根据需要调整输出缓冲区的大小?

    在流中,缓冲区只是传递到另一个流之前的临时空间。更改缓冲区大小可以改变性能,但与处理的数据量关系不大。

    2.我可以使用 ByteArrayOutputStream 并将 DeflatorOutputStream 包装在其周围,而不是猜测缓冲区的大小吗?由于 ByteArrayOutputStream 改变了字节数组的大小,因此不必知道输出的大小或猜测它,就像在 API 示例中似乎必须做的那样。

    您可以这样做,也可以将其直接发送到您希望数据转到的流中。

    【讨论】:

    • 您对#2 的回答是一个巨大的帮助——尤其是对于我正在做的事情。但我仍然不清楚#1。如果需要,Deflater 或 Inflater 是否会更改输出缓冲区大小?如果不是,我怎么知道输出字节数组有多大?
    • 缓冲区大小不会改变,也不需要改变,因为它只是临时存储。您只会出于性能原因更改它。
    • 所以当我将一个 byte[] 传递给 Deflater 时,它只是一个工作缓冲区?输出到哪里去?从 API 示例来看,输出似乎进入了传递给 Deflater 的缓冲区。
    • 直接使用 Deflator 是一项艰巨的工作,如果你想看看它是如何完成的,请查看 DeflatorOutputStream(或者直接使用 DeflatorOutputStream)
    • 好的——这对很多有帮助!从我所看到的情况来看,将 DeflaterOutputStream 包裹在 ByteArrayOutputStream 周围并这样做看起来要容易得多。我想知道是不是出了什么问题,因为这看起来比使用 Deflater 更容易——我想我一定不会得到什么。
    【解决方案2】:

    下面是一个使用字节数组进行压缩和解压的例子:

    import java.util.zip.Deflater;
    import java.util.zip.InflaterInputStream;
    ...
    
    byte[] sourceData; // bytes to compress (reuse byte[] for compressed data)
    String filename; // where to write
    {
        // compress the data
        Deflater deflater = new Deflater(Deflater.DEFAULT_COMPRESSION);
        deflater.setInput(sourceData);
        deflater.finish();
        int compressedSize = deflater.deflate(data, 0, sourceData.length, Deflater.FULL_FLUSH);
    
        // write the data   
        OutputStream stream = new FileOutputStream(filename);
        stream.write(data, 0, compressedSize);
        stream.close();
    }
    
    {
        byte[] uncompressedData = new byte[1024]; // where to store the data
        // read the data
        InputStream stream = new InflaterInputStream(new FileInputStream(filename)); 
        // read data - note: may not read fully (or evenly), read from stream until len==0
        int len, offset = 0;
        while ((len = stream.read(uncompressedData , offset, uncompressedData .length-offset))>0) {
            offset += len;
        }           
        stream.close();
    }
    

    【讨论】:

    • 你有一个错误,你永远无法定义data 的来源。
    • 数据来自文件(之前写入的压缩数据)。请参阅InputStream stream = new InflaterInputStream(new FileInputStream(filename)) 行。 stream 现在有一个文件输入流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多