设置Java Deflater(和Inflater)输出字节缓冲区的大小

时间:2013-01-07 08:06:01

标签: java zlib deflate

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

看完这些例子之后,我有两个问题可能是无关的,但是我们似乎已经联系起来,因为我试图理解这一点。

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

  

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

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

答案 1 :(得分:0)

以下是使用字节数组进行压缩和解压缩的示例:

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();
}