多部分gzip文件随机访问(Java)

tol*_*uju 6 compression gzip multipart random-access

这可能属于"不太可行"或"不值得付出努力"的范畴,但这里也是如此.

我正在尝试随机访问存储在多部分gzip文件中的记录.具体来说,我感兴趣的文件是压缩的Heretrix Arc文件.(如果您不熟悉多部分gzip文件,gzip规范允许在单个gzip文件中连接多个gzip流.它们不共享任何字典信息,它是简单的二进制附加.)

我认为应该可以通过寻找文件中的某个偏移来执行此操作,然后扫描gzip魔术头字节(即根据RFC的 0x1f8b ),并尝试从以下字节读取gzip流.这种方法的问题在于,那些相同的字节也可能出现在实际数据中,因此寻找这些字节会导致无效的位置开始从中读取gzip流.有没有更好的方法来处理随机访问,因为记录偏移不是先验已知的?

Che*_*eso 1

正如您所意识到的,GZIP 的设计对于随机访问并不友好。

您可以按照您的描述进行操作,然后如果您在解压缩器中遇到错误,则可以断定您找到的签名实际上是压缩数据。
如果完成解压,那么很容易通过 CRC32 来验证刚刚解压的流的有效性。

如果文件不是很大,您可以考虑仅解压缩系列中的所有条目,并保留签名的偏移量以构建目录。解压缩时,将字节转储到位桶中。此时您将生成一个目录,然后您可以支持基于文件名、日期或其他元数据的随机访问。

对于 100k 以下的文件来说,这将相当快。猜测一下,如果您有 10 个文件,每个文件大约 100k,那么在现代 CPU 上可能会在 2 秒内完成。这就是我所说的“相当快”。但只有您知道应用程序的性能要求。

你有 GZipInputStream 类吗?如果是这样,你就成功了一半。