2009-08-04 85 views
5

这可能落在“不太可行”或“并不真正值得付出”的领域,但在这里。多部分gzip文件随机存取(以Java编程)

我想随机访问存储在多部分gzip文件中的记录。具体而言,我感兴趣的文件被压缩为Heretrix Arc文件。 (如果你不熟悉多部分的gzip文件,使用gzip规范允许多个gzip的流在一个gzip文件并置。他们不共享任何字典信息,这是简单的二进制追加。)

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

回答

1

正如你所意识到的那样,GZIP的设计对随机访问不友好。

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

如果文件不是很大,可以考虑解压缩所有的串行条目,并保留签名的偏移量以建立一个目录。当你解压时,将这些字节转储到一个桶中。此时您将生成一个目录,然后您可以根据文件名,日期或其他元数据支持随机访问。

对于100k以下的文件,这将会相当快。就像猜测一样,如果你有10个大约100k的文件,它可能会在现代CPU上以2s完成。这就是我所说的“非常快”。但只有你知道你的应用程序的性能要求。

你有GZipInputStream类吗?如果是这样,你就在那里。