Java 替换gzip文件中的内容而不解压缩它

Java 替换gzip文件中的内容而不解压缩它,java,compression,Java,Compression,我正在从一个webservice接收以gzip格式压缩的xml文件。xmls的原始大小约为80Mb,压缩版本约为10Mb。这些xml文件存储在我们的缓存中 xml根包含一个表示8位唯一ID的属性。因此,当我们从缓存提供响应时,我们需要在将xml返回给最终用户之前,使用从另一个Web服务接收的另一个ID来更改此ID 这一过程应当是: 解压缩缓存xml 将缓存的ID替换为从Web服务接收的ID 再次压缩文件并将其返回给客户端 是否可以在不解压缩整个文档并再次压缩的情况下执行此替换?任何类型的部分读写

我正在从一个webservice接收以gzip格式压缩的xml文件。xmls的原始大小约为80Mb,压缩版本约为10Mb。这些xml文件存储在我们的缓存中

xml根包含一个表示8位唯一ID的属性。因此,当我们从缓存提供响应时,我们需要在将xml返回给最终用户之前,使用从另一个Web服务接收的另一个ID来更改此ID

这一过程应当是:

  • 解压缩缓存xml
  • 将缓存的ID替换为从Web服务接收的ID
  • 再次压缩文件并将其返回给客户端

  • 是否可以在不解压缩整个文档并再次压缩的情况下执行此替换?任何类型的部分读写?

    不。您必须对其进行解压缩,至少要找到ID的编码位置和编码方式。然后,您可以a)非常聪明,找到如何使用当前定义的代码表重新组合具有不同ID但位数相同的流,基本上解决了一个难题(假设它可以解决),或者b)使用新ID重新压缩整个流程


    如果您控制着对起始点的压缩,那么您可以通过在ID之前切换到no compression,在ID之后刷新块(一个存储的块),然后继续压缩来专门准备流。您可以注意到它在输出流中的位置。然后,您可以稍后替换ID,它在流中直接显示为这些字节。您还需要更新CRC,对于该CRC,您可以使用旧未压缩数据和新未压缩数据的“原始”CRC或“独占”CRC或原始CRC。这只是旧ID和ID的异或,前面和后面有一堆零来填充数据长度。“原始”CRC是一种CRC寄存器初始化为零且没有最终的异或的CRC。

    否。您必须对其进行解压缩,至少要找到ID编码的位置和方式。然后,您可以a)非常聪明,找到如何使用当前定义的代码表重新组合具有不同ID但位数相同的流,基本上解决了一个难题(假设它可以解决),或者b)使用新ID重新压缩整个流程


    如果您控制着对起始点的压缩,那么您可以通过在ID之前切换到no compression,在ID之后刷新块(一个存储的块),然后继续压缩来专门准备流。您可以注意到它在输出流中的位置。然后,您可以稍后替换ID,它在流中直接显示为这些字节。您还需要更新CRC,对于该CRC,您可以使用旧未压缩数据和新未压缩数据的“原始”CRC或“独占”CRC或原始CRC。这只是旧ID和ID的异或,前面和后面有一堆零来填充数据长度。“原始”CRC是一种CRC寄存器初始化为零且没有最终异或的CRC。

    能否显示正在解压缩、替换然后再次压缩的代码?可能还有改进的余地,但还没有编码,但想法是:1。使用未压缩的文档创建一个字节[](使用gzipinputstream)。2.逐字节替换8位数字(避免任何临时副本)。3.使用gzipoutputstream压缩这个字节[]。能否显示要解压缩、替换然后再次压缩的代码?可能还有改进的余地,但还没有编码,但想法是:1。使用未压缩的文档创建一个字节[](使用gzipinputstream)。2.逐字节替换8位数字(避免任何临时副本)。3.使用gzipoutputstream压缩此字节[]。