这是我的用例:
是否有支持(全局压缩+个人访问)的归档格式?从理论上讲,这两个目标并不相互排斥。
注意:这是针对Java项目的,因此我被限制为也具有Java库的格式。
答案 0 :(得分:2)
我不知道您的问题的固定解决方案,因此您可能需要自己编写。
当然可以做到。我会使用tar格式,因为它很简单且易于理解,但它需要一个带有索引信息的辅助文件到压缩档案中。您要做的是控制tar文件的压缩以创建不需要历史记录的入口点。这些入口点需要比1K远得多,以实现良好的压缩,但它们可以足够接近,以提供对1K文件的相对快速的随机访问。
最简单的方法是使用gzip分别压缩tar文件的块,这些块表示一组大约128K字节的完整文件集。 gzip流可以简单地连接起来,生成的.tar.gz文件可以正常使用tar实用程序。它是gzip格式的一个属性,有效的gzip流连接也是有效的gzip流。
辅助文件将包含tar存档中的文件列表,它们在未压缩的tar文件中的大小和偏移量,然后分别包含每个gzip流起始点的压缩和未压缩偏移量。然后在提取文件时,您将在未压缩的tar文件中查找其偏移量,找到最大未压缩偏移量小于或等于该文件偏移量的gzip流,然后从相应的压缩偏移量开始解压缩,直到找到该文件
对于此示例,平均而言,您只需要解压缩64K即可获取存档中的任何给定文件。
答案 1 :(得分:0)
通常,构建的压缩表中散布着引用它的压缩数据。
如果有人想自己做压缩,一种方法是:
[sharedcompression table]...
[compression table addition specific to file 1] [file 1]
,, ,, ,, ,, ,, 2 ,, 2
...
最后shuffle / share压缩表部分。
对于7zip,bzip和其他人来说,是否会获得这个问题。
BTW java zip处理(仍然?)不使用文件末尾的可选文件索引。