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

时间:2012-09-06 12:33:24

标签: java zip random-access

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

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

有没有办法获得类似“ZipRandomAccessFile”的东西,比如jdk中可用的ZipOutputStream?

它不一定只是jdk,我不介意参加第三方库来完成工作。

任何想法或建议......?

3 个答案:

答案 0 :(得分:1)

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

事实上,由于Zip和Zip可以包含多个条目,因此您可以将顺序数据写入一个ZipEntry,将“仅在完成时”的数据写入单独的ZipEntry - 其中充分利用两个世界。

很容易编写,而不必回到大型顺序块的开头。它易于阅读 - 如果消费者在阅读更大的资源之前需要知道'标题'数据,他们可以在继续之前读取该zip条目中的数据。

答案 1 :(得分:0)

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

总结一下,ZIP / DEFLATE不是这种格式。但是,将数据分解为单独压缩的较小的固定大小的文件可能是可行的。

答案 2 :(得分:0)

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

  • 您事先不知道如何压缩数据。因此,如果您更改某些数据块,其压缩版本很可能会更长或更短。
  • 作为压缩算法处理数据流,它使用到目前为止累积的知识(如发现的重复模式)来压缩当前位置的数据。因此,如果您更改了某些内容,则算法需要重新压缩从此更改到结束的所有内容。

所以唯一合理的解决方案是操纵数据并在最后立即压缩。