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

6
我需要对一个或多个字节数组进行压缩,然后再将它们解压回正常大小。我查看了api文档中给出的示例,并找到了其他示例。
在查看这些示例之后,我有两个问题可能不相关,但它们似乎是相互关联的,因为我正在尝试理解这个过程。
  1. 在API文档示例中,Inflater和Deflater的输出缓冲区都设置为1024字节。示例数据只是一个短句子,所以这是合理的。但是我怎么知道要将输出缓冲区设置多大呢?或者Deflater(和Inflater)会根据需要调整输出缓冲区的大小吗?

  2. 可以使用ByteArrayOutputStream并在其周围包装一个DeflatorOutputStream来代替猜测缓冲区的大小吗?由于ByteArrayOutputStream更改字节数组的大小,因此不必知道输出的大小或猜测它,就像在API示例中必须做的那样。

2个回答

3

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

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

2.我可以使用ByteArrayOutputStream并在其周围包装一个DeflatorOutputStream来代替猜测缓冲区的大小吗?由于ByteArrayOutputStream更改了字节数组的大小,因此不需要知道输出的大小或猜测它,就像在API示例中一样。

您可以这样做,或者直接将其发送到您想要数据进入的流中。


你对第二个问题的回答非常有帮助,特别是对于我正在做的事情。但是我仍然不清楚第一个问题。Deflater或Inflater是否会根据需要更改输出缓冲区大小?如果不是,我如何知道要将输出字节数组设置多大? - Tango
缓冲区大小不会改变,也不需要改变,因为它只是临时存储。你只有出于性能原因才会更改它。 - Peter Lawrey
那么当我将byte[]传递给Deflater时,它只是一个工作缓冲区?输出放在哪里?从API示例中可以看出,输出放在传递给Deflater的缓冲区中。 - Tango
直接使用Deflator很费力,如果你想看看它是如何完成的,请查看DeflatorOutputStream(或者直接使用DeflatorOutputStream)。 - Peter Lawrey
1
好的 - 这帮了我很多!从我所看到的,似乎只需在 ByteArrayOutputStream 周围包装一个 DeflaterOutputStream 并以这种方式完成会更容易得多。我一直在想是否有什么问题,因为那看起来比仅使用 Deflater 更容易 - 我想我可能没有理解到某些东西。 - Tango

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

你有一个错误,你从未定义data来自哪里。 - Jason S
数据来自文件(压缩数据之前已写入)。请参见行InputStream stream = new InflaterInputStream(new FileInputStream(filename))。 现在,stream拥有一个文件输入流。 - nikk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接