5

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

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

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

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

4

2 回答 2

3

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

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

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

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

于 2013-01-07T09:05:09.897 回答
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();
}
于 2013-05-23T20:42:09.320 回答