对zip文件透明地写入随机访问文件



我有一个java应用程序,它将RandomAccessFile写入文件系统。它必须是英国皇家空军,因为有些事情直到最后才知道,然后我在文件的开头寻找并写下一些信息。

我想以某种方式将该文件放入zip档案中。我想我最后可以这么做,但这将涉及到复制到目前为止编写的所有数据。由于这些文件可能会变得非常大,我更喜欢一种不涉及复制数据的方式。

有没有办法获得类似"ZipRandomAccessFile"的东西,一个在jdk中可用的ZipOutputStream?

它不一定只有jdk,我不介意引入第三方库来完成这项工作。

有什么想法或建议吗。。?

也许您需要更改文件格式,以便按顺序写入。

事实上,由于它是一个Zip,Zip可以包含多个条目,因此您可以将顺序数据写入一个ZipEntry,将已知的"仅在完成时"写入一个单独的ZipEntry,这将两全其美。

它很容易编写,不必回到大的连续块的开头。它很容易读取——如果消费者在读取更大的资源之前需要知道"头"数据,那么他们可以在继续之前读取该zip条目中的数据。

DEFLATE格式的指定方式,只有从一开始就读取它才有意义。因此,每次来回查找时,底层zip实现都必须从一开始就开始读取文件。如果您修改了某个内容,则必须首先解压缩整个文件(而不仅仅是到修改点),将更改应用于解压缩的数据,然后再次压缩整个文件。

总之,ZIP/DEFLATE不是这种格式。然而,将您的数据分解为更小、固定大小的文件并单独压缩可能是可行的。

压缩的目的是识别数据中的冗余(比如一些字符出现频率更高或重复模式),并通过在没有冗余的情况下对数据进行编码来缩小数据。这使得创建允许随机访问写入的压缩算法变得不可行。特别是:

  • 你永远不知道一段数据的压缩效果如何。因此,如果您更改某个数据块,其压缩版本很可能更长或更短
  • 当压缩算法处理数据流时,它使用迄今为止积累的知识(如发现的重复模式)来压缩当前位置的数据。因此,如果你改变了什么,算法需要重新压缩从这个改变到最后的所有内容

因此,唯一合理的解决方案是对数据进行操作,并在最后立即对其进行压缩。

最新更新